TextView更改适用于使用ListView和ArrayAdapter

时间:2015-10-15 07:47:53

标签: android listview android-arrayadapter textview

我很久以前就开始了一个小项目,主要目标是让我在100周的时间内跟踪我的行为。

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

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

在每个TextView上设置onclicklistener,以便当用户在textview上执行单击时,背景颜色将变为红色。

然而;每当我点击一个文本视图时 - 不止一个文本视图被着色。

注意:

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

  2. 我还保存了对当前绘制的textview的引用,因此我可以确保当用户单击其他文本视图时,前一个文本视图将失去其红色背景。

  3. 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 个答案:

答案 0 :(得分:0)

好的,你的背景正在改变,因为当你滚动你的ListView getView()被调用时它会考虑你当前的TextView位置(作为当前的 view )并在它检测时设置它的背景setBackground()听众上的onClick方法..

首先,我建议您创建适配器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 值上测试了它它工作了

我不是专家,所以如果我错了,请告诉我

希望它有效!!!