使用 ListView 和 ArrayAdapter 将 TextView 更改应用于多个 TextView
A TextView change applies to multiple TextViews using ListView and ArrayAdapter
不久前我开始做一个小项目,主要目标是为我打造一种方法来跟踪我在 100 周内的行为。
我还是个菜鸟 android 开发者,我遇到了一个我无法解释的问题。
基本上我使用 ArrayAdapter 填充了一个 ListView,其中包含一个包含 100 个字符串的列表(第 1 周、第 2 周、第 3 周 ...第 100 周)
在每个 TextView 上设置一个 onclicklistener,这样当用户点击一个 textview 时,背景颜色会变成红色。
但是;每当我单击单个 textview - 不止一个 textview 被着色。
备注:
我正在使用 ScrollView 滚动整个列表。 (填充后,100 周列表会填满整个屏幕,滚动视图用于访问整个列表。)
我还保存了对当前绘制的 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;
}
});
}
好的,您的背景正在随机播放,因为当您滚动时,您的 ListView getView()
被调用并且它考虑您当前的 TextView 位置(作为当前 view)并设置背景在它上面,因为它在 onClick
侦听器上检测 setBackground()
方法..
首先我建议创建一个适配器 class extends ArrayAdapter<?>
解决方案一:
在 onClick
侦听器上使用 setTag()
在您的文本视图上,例如..
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
数组适配器class:
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 value.I 已经在 1000 值并且有效
我不是专家所以如果我哪里错了请告诉我
希望它有用!!!
不久前我开始做一个小项目,主要目标是为我打造一种方法来跟踪我在 100 周内的行为。
我还是个菜鸟 android 开发者,我遇到了一个我无法解释的问题。
基本上我使用 ArrayAdapter 填充了一个 ListView,其中包含一个包含 100 个字符串的列表(第 1 周、第 2 周、第 3 周 ...第 100 周)
在每个 TextView 上设置一个 onclicklistener,这样当用户点击一个 textview 时,背景颜色会变成红色。
但是;每当我单击单个 textview - 不止一个 textview 被着色。
备注:
我正在使用 ScrollView 滚动整个列表。 (填充后,100 周列表会填满整个屏幕,滚动视图用于访问整个列表。)
我还保存了对当前绘制的 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;
}
});
}
好的,您的背景正在随机播放,因为当您滚动时,您的 ListView getView()
被调用并且它考虑您当前的 TextView 位置(作为当前 view)并设置背景在它上面,因为它在 onClick
侦听器上检测 setBackground()
方法..
首先我建议创建一个适配器 class extends ArrayAdapter<?>
解决方案一:
在 onClick
侦听器上使用 setTag()
在您的文本视图上,例如..
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
数组适配器class:
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 value.I 已经在 1000 值并且有效
我不是专家所以如果我哪里错了请告诉我
希望它有用!!!