TextView 更改适用于使用 ListView 和 ArrayAdapter 的多个 TextView
Posted
技术标签:
【中文标题】TextView 更改适用于使用 ListView 和 ArrayAdapter 的多个 TextView【英文标题】:A TextView change applies to multiple TextViews using ListView and ArrayAdapter 【发布时间】:2016-01-13 13:43:42 【问题描述】:不久前我开始从事一个小项目,主要目标是为我打造一种方法来跟踪我在 100 周内的行为。
我还是一个新手 android 开发者,我遇到了一个我无法解释的问题。
基本上我已经使用 ArrayAdapter 填充了一个 ListView,其中包含一个包含 100 个字符串(Week1、Week2、Week3 ... Week100)的列表
在每个 TextView 上设置一个 onclicklistener,这样当用户点击一个 textview 时,背景颜色会变为红色。
但是;每当我单击一个文本视图时 - 不止一个文本视图被着色。
注意事项:
我正在使用 ScrollView 滚动整个列表。 (填充后,100 周列表会填满整个屏幕,滚动视图用于访问整个列表。)
我还保存了对当前绘制的 textview 的引用,这样我可以确保当用户单击不同的 textview 时,前一个 textview 会失去其红色背景。
MainActivity 初始化:
public class MainActivity extends ActionBarActivity
TextView selectedWeek; // Reference to the selected week.
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
populateWeekList(); // Populating the ListView
initWeekClick(); // Initializing click listener
填充 ListView:
public void populateWeekList()
String[] weeks = new String [100]; // 100 weeks
for (int i=0; i<100;i++)
weeks[i] = "Week"+(i+1);
ArrayAdapter<String> weekAdapter = new ArrayAdapter<String>(
this,
R.layout.weeksview,
weeks
);
// R.id.weekTypeList is just a normal TextView.
ListView weekList=(ListView) findViewById(R.id.weekTypeList);
weekList.setAdapter(weekAdapter);
用于初始化 onClickListener 并保存 selectedWeek 引用的代码:
public void initWeekClick()
ListView weekList=(ListView) findViewById(R.id.weekTypeList);
weekList.setOnItemClickListener(new AdapterView.OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id)
if (selectedWeek != null)
selectedWeek.setBackgroundColor(0);
TextView clicked = (TextView) viewClicked;
// Change clicked TextView color to red.
clicked.setBackgroundColor(getResources().getColor(android.R.color.holo_red_light));
// Save the selected week reference
selectedWeek = clicked;
);
【问题讨论】:
【参考方案1】:好的,您的背景正在随机播放,因为当您滚动 ListView getView()
时,它会考虑您当前的 TextView 位置(作为当前 view)并在检测到 @987654322 时在其上设置背景@方法onClick
监听器就可以了..
首先我建议创建一个Adapter类extends ArrayAdapter<?>
解决方案 1:
在您的文本视图上使用setTag()
onClick
监听器,例如..
text.setTag(position);
在上面使用getTag()
并设置条件
if(holder.text.getTag().equals(position))
holder.text.setBackgroundColor(Color.BLUE);
else
holder.text.setBackgroundColor(Color.WHITE);
解决方案 2:
将此添加到onCreate
方法
ArrayList<String> _array = new ArrayList<String>();
for(int i=0 ; i <1000; i ++) // 1000 value
_array.add(i+"");
list.setAdapter(new MainAdapter(this, _array)); // pass you list here
ArrayAdapter 类:
public class MainAdapter extends ArrayAdapter<String>
ArrayList<String> _st = new ArrayList<String>();
ArrayList<Integer> check = new ArrayList<Integer>();
Context _context;
public MainAdapter(Context context,ArrayList<String> _st)
super(context,R.layout.main, _st); // your inflate layout
this._context = context;
this._st = _st;
@Override
public int getCount()
return _st.size();
@Override
public long getItemId(int position)
return 0;
@Override
public View getView(final int position, View convertView, ViewGroup parent)
//---//
// check if current position is there in arraylist
if(checking(position))
holder.text.setBackgroundColor(Color.BLUE);
else
holder.text.setBackgroundColor(Color.WHITE);
holder.text.setOnClickListener(new OnClickListener()
@Override
public void onClick(View arg0)
// set background and put value in array list
holder.text.setBackgroundColor(Color.BLUE);
check.add(position);
);
return convertView;
// this will check whether current position is there is array list or not and if it there it will break loop and return true
public boolean checking(int position)
boolean fine = false;
for(int i=0; i<check.size();i++)
if(position == check.get(i))
fine = true;
break;
return fine;
public class ViewHolder
TextView text;
我不知道我在这段代码中有多少道德......但正如你所指定的那样,你有 100 价值。我已经在 1000 价值上对其进行了测试它起作用了
我不是专家,所以如果我在某个地方错了,请告诉我
希望有用!!!
【讨论】:
R.id.text 是什么意思?你指的“文本”是什么?这必须是动态的,用户可以点击 100 个 TextView 中的任何一个 你的R.layout.weeksview
中的TextView
的id
数组适配器创建了 100 次,我如何区分它们,我尝试将单击的视图传递给引用,因此,从逻辑上讲,我应该只访问一个 TextView。
问题是多个Textviews的背景发生了变化。例如:用户点击“Week1”,它被涂成红色。 - 到目前为止,一切都很好。然而;当您向下滚动时,您会注意到“Week11”、“Week21”、“Week31”……等等,也会被绘制出来。
我已经改变了我的答案..看看它......请根据你的改变变量..以上是关于TextView 更改适用于使用 ListView 和 ArrayAdapter 的多个 TextView的主要内容,如果未能解决你的问题,请参考以下文章
动态更改 ListView 中三个不同组的 TextView 颜色
在 ListView 适配器的 getView(...) 中更改 TextView 颜色和文本