1. 程式人生 > >Android 利用介面將adapter中的控制元件傳給activity,實現互動

Android 利用介面將adapter中的控制元件傳給activity,實現互動

最近的功能對我這種基本沒什麼經驗的白菜來說,真是越來越有難度了喔。來記錄一下:
新功能要實現類似微博列表的功能,包括佈局及功能都很相似。首先說說佈局,Listview的item顯示的不同的佈局。這個只要在adapter中重寫幾個方法就可以了:1、getItemViewType(int position); 2、getViewTypeCount 3、然後在getView(final int position, View convertView, ViewGroup parent)中根據TYPE型別設定不同的佈局就好了。這個網上有很多例子,這裡給一個好了:Listview的item設定不同佈局

第二個就是item的區域性重新整理問題了。比如點贊!
這裡寫圖片描述
點贊之後要改變圖示的顏色,而且只要改變當前item的就好了,沒必要全部重新整理一遍啊。這個時候,一個大神給我提供了新思路:利用介面、介面、介面。重要的事情說三遍!!
原則上呢,就是在adapter中暴露介面給activity,將item中的子控制元件通過介面傳出去,剩下的只要在activity中處理就好啦!上程式碼!! 是我看到的一篇部落格中的,道理說得很清楚。就直接轉過來了。
有時需要在activity中直接獲取listview中每一項(item)的子控制元件,這個時候我可以使用介面來與activity通訊,將子控制元件作為引數傳遞過來。程式碼如下:

ListViewDemoAdapter 介面卡程式碼:

private static final String TAG = ListViewDemoAdapter.class.getSimpleName();

    /**
     * 上下文
     */
    private Context mContext;

    /**
     * LayoutInflater
     */
    private LayoutInflater mInflater;

    private List<String> datas;

    public ListViewDemoAdapter
(Context context,List<String> list){ this.mContext = context; this.datas = list; this.mInflater = LayoutInflater.from(context); } @Override public int getCount() { return datas.size(); } @Override public String getItem(int position) { return datas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if(convertView == null){ holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.listitem,null); holder.tv_name = (TextView) convertView.findViewById(R.id.tv_name); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } holder.tv_name.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d(TAG,"setOnClickListener-->onClick..."); //回撥傳遞點選的view mItemOnClickListener.itemOnClickListener(v); } }); return convertView; } private ItemOnClickListener mItemOnClickListener; public void setmItemOnClickListener(ItemOnClickListener listener){ Log.d(TAG,"setmItemOnClickListener..."); this.mItemOnClickListener = listener; } public interface ItemOnClickListener{ /** * 傳遞點選的view * @param view */ public void itemOnClickListener(View view); } public class ViewHolder{ public TextView tv_name; }

MainActivity 程式碼:


public class MainActivity extends AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();

    /**
     * listview
     */
    private ListView mLvDemo;

    private List<String> list = new ArrayList<String>();

    private  ListViewDemoAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化view
        initView();
        //初始化資料
        initData();
    }

    /**
     * 初始化view
     * @author crystal
     * @date 2015-9-4 22:24
     */
    private void initView(){
        //初始化listview
        mLvDemo = (ListView) findViewById(R.id.lv_demo);
        mAdapter = new ListViewDemoAdapter(MainActivity.this,list);
        mLvDemo.setAdapter(mAdapter);

        //獲取點選的view子控制元件
        mAdapter.setmItemOnClickListener(new ListViewDemoAdapter.ItemOnClickListener() {

            /**
             *  點選的view子控制元件
             * @param view view子控制元件
             */
            @Override
            public void itemOnClickListener(View view) {
                Log.d(TAG, "itemOnClickListener view...");
                TextView tvName = (TextView)view;
                //提示點選的子控制元件的文字
                Toast.makeText(MainActivity.this,tvName.getText().toString(),Toast.LENGTH_LONG).show();
            }
        });
    }

    /**
     * 初始化資料
     * @author crystal
     * @date 2015-9-4 22:51
     */
    private void initData(){
        list.add("crystal");
        list.add("jack");
        list.add("tom");
        list.add("rose");
        list.add("lora");
        list.add("tony");
        mAdapter.notifyDataSetChanged(); //更新資料
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

activity_main.xml :


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@+id/lv_demo"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>
</LinearLayout>

listitem.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="15dp"
    android:gravity="center_horizontal"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="crystal"/>

</LinearLayout>

OK!