点击单独的按钮

时间:2018-06-08 08:19:27

标签: android listview

我有一个带有一些项目的listView现在我想通过单击一个不在列表中的单独按钮来更改背景颜色或项目文本颜色。我怎么能在我的Android应用程序中这样做?

这是我的主要活动:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    arrayAdapter = new SubArrayAdapter(this, dataItemList);
    ListView lv = findViewById(R.id.mylist);
    lv.setAdapter(arrayAdapter);


    ImageButton btn_check = findViewById(R.id.button_checkout);
    btn_check.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

// how can I access the list items within this click-handler method

});

列出项目布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/listitems"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp">

<ImageView
    android:id="@+id/yes_image"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:paddingRight="5dp"
    android:visibility="invisible"
    />

<ImageView
    android:id="@+id/no_image"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:paddingRight="5dp"
    android:visibility="invisible"
    />

<TextView
    android:id="@+id/paragraph_description"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@id/yes_image"
    android:layout_toRightOf="@id/yes_image"
    android:textColor="@color/paragraph_items_colro"
    android:textSize="16sp"
    android:textStyle="normal" />
</RelativeLayout>

Activity_main xml布局文件:

android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textAlignment="center"
android:textDirection="ltr"
tools:context=".MainActivity">
<ListView
    android:id="@+id/mylist"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp"
    android:background="@android:color/transparent"
    android:divider="@color/colorAccent"
    android:dividerHeight="1dp"
    android:listSelector="#0f0"
    app:layout_constraintStart_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

</ListView>

<LinearLayout
    android:id="@+id/btn_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:orientation="horizontal"
    app:layout_constraintTop_toBottomOf="@id/mylist">
    <ImageButton
        android:id="@+id/button_checkout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:background="@drawable/checkout_9"
        android:src="@drawable/checkout_9"
        app:layout_constraintTop_toBottomOf="@id/mylist"
        tools:layout_editor_absoluteX="106dp" />
</LinearLayout>
</android.support.constraint.ConstraintLayout>

我有自己的适配器类,在getview()方法中我填充了列表项

这个内部类位于mainactivity中:

   private class SubArrayAdapter extends ArrayAdapter<DataItem> {
    private List<DataItem> items;
    private Context context;

    public SubArrayAdapter(@NonNull Context context, @NonNull List<DataItem> 
        items) {
        super(context, R.layout.listitems, items);
        this.items = items;
        this.context = context;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull 
       ViewGroup parent) {
        DataItem dataitem1 = items.get(position);
         LayoutInflater inflater = (LayoutInflater) 
       context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.listitems, null);
        TextView tv = (TextView) 
    view.findViewById(R.id.paragraph_description);
        tv.setText(dataitem1.getDescription());
        tv.setTag(position + 100);
        ImageView yes_iv = view.findViewById(R.id.yes_image);
        int yes_res = context.getResources().getIdentifier("yes", 
                                             "drawable", getPackageName());
        yes_iv.setImageResource(yes_res);
        yes_iv.setTag(position + 200);
        //yes_iv.setVisibility(View.VISIBLE);
        ImageView no_iv = view.findViewById(R.id.no_image);
        int no_res = context.getResources().getIdentifier("no", "drawable", 
        getPackageName());
        no_iv.setImageResource(no_res);
        no_iv.setTag(position + 300);
        return view;
    }
  }

    }

1 个答案:

答案 0 :(得分:0)

我注意到您已在android:listSelector中为ListView设置了activity_main.xml - 这使您能够在单击时更改项目的背景。< / p>

所以我决定查看它在ListView课程中是如何运作的。

我查看了ListView的源代码并搜索了短语selector。有一条线:

} else if (mAction == STATE_REQUEST_FOCUS) {
        final int childIndex = mPosition - mFirstPosition;
        final View child = getChildAt(childIndex);
        if (child != null) {
            child.requestFocus();
        }
        mAction = -1;
    }
final View child = getChildAt(childIndex);

遵循这些步骤 - 我知道问题的解决方案。这是:

ImageButton imageButton = findViewById(R.id.button_checkout);
imageButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        int hardCodedPoositionToSelect = 1;

        View childAt = listView.getChildAt(hardCodedPoositionToSelect);
        if (childAt != null) {
            //change background
            childAt.setBackgroundColor(Color.RED);

            //change textView color of current view
            TextView paragraphDescription = childAt.findViewById(R.id.paragraph_description);
            paragraphDescription.setTextColor(Color.MAGENTA);
        }
    }
});

您可以在getChildAt()上看到我正在呼叫listView,以便根据hardCodedPoositionToSelect的项目位置获取当前项目的视图。