【问题标题】:A TextView change applies to multiple TextViews using ListView and ArrayAdapterTextView 更改适用于使用 ListView 和 ArrayAdapter 的多个 TextView
【发布时间】:2016-01-13 13:43:42
【问题描述】:

不久前我开始从事一个小项目,主要目标是为我打造一种方法来跟踪我在 100 周内的行为。

我还是一个新手 android 开发者,我遇到了一个我无法解释的问题。

基本上我已经使用 ArrayAdapter 填充了一个 ListView,其中包含一个包含 100 个字符串(Week1、Week2、Week3 ... Week100)的列表

在每个 TextView 上设置一个 onclicklistener,这样当用户点击一个 textview 时,背景颜色会变为红色。

但是;每当我单击一个文本视图时 - 不止一个文本视图被着色。

注意事项:

  1. 我正在使用 ScrollView 滚动整个列表。 (填充后,100 周列表会填满整个屏幕,滚动视图用于访问整个列表。)

  2. 我还保存了对当前绘制的 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;
        }
    });
}

【问题讨论】:

    标签: android listview android-arrayadapter textview


    【解决方案1】:

    好的,您的背景正在随机播放,因为当您滚动 ListView getView() 时,它会考虑您当前的 TextView 位置(作为当前 view)并在检测到 @987654322 时在其上设置背景@方法onClick监听器就可以了..

    首先我建议创建一个Adapterextends ArrayAdapter&lt;?&gt;

    解决方案 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”……等等,也会被绘制出来。
    • 我已经改变了我的答案..看看它......请根据你的改变变量..
    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2015-10-15
    • 2010-11-28
    相关资源
    最近更新 更多