1. 程式人生 > >Recyclerview的一些個人理解與使用(二)實現一個簡單的列表介面

Recyclerview的一些個人理解與使用(二)實現一個簡單的列表介面

公司專案前一段時間有些忙 ,忙完後趕緊就來寫下了這篇文章,上次的文章

中,我們對Recyclerview進行了一個基礎的封裝,這次我們就用上次的封裝實現一個最簡單的Recyclerview。
先來看看效果圖
這裡寫圖片描述
一個簡單的列表。下面是佈局檔案:
先是介面佈局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.ztn.recyclerviewdemo.MainActivity">
<RelativeLayout android:id="@+id/main_activity_recyclerview_rl" android:layout_width
="match_parent" android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView android:id="@+id/main_activity_recyclerview" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView
>
</RelativeLayout> </LinearLayout>

然後是item的佈局檔案

<?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">

    <TextView
        android:id="@+id/simple_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="5dp"
        android:textSize="14sp"/>
</LinearLayout>

然後是程式碼
在MainActivity中有個Recyclerview,我們對控制元件進行初始化。

/**
 * Created by ztn on 2017/3/28
 *
 * @see MainActivity
 */

public class MainActivityHolder extends BaseViewFinder {
    RecyclerView recyclerView;

    protected MainActivityHolder(Activity activity) {
        super(activity);
        recyclerView = (RecyclerView) activity.findViewById(R.id.main_activity_recyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(activity));
    }
}

BaseViewFinder我放在了common中

/**
 * * Created by ztn on 2017/3/28
 * <p>
 * 所有activity的介面holder都繼承這個Base,以便於介面功能分離 ,記得在app的gradle中,對common進行依賴
 */

public abstract class BaseViewFinder {
    protected Activity activity;

    protected BaseViewFinder(Activity activity) {
        this.activity = activity;
    }
}

MainActivity介面程式碼:


/**
 * Created by ztn on 2017/3/28
 */
public class MainActivity extends BaseActivity {
    MainActivityHolder mainActivityHolder;
    List<String> main;
    MainRecyclerViewAdapter mainRecyclerViewAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainActivityHolder = new MainActivityHolder(this);
        main = new ArrayList<>();
        main.add("簡單的RecyclerView");
        for (int i = 0; i < 40; i++) {
            main.add(i + "");
        }
        mainRecyclerViewAdapter = new MainRecyclerViewAdapter(getContext(), main);
        mainActivityHolder.recyclerView.setAdapter(mainRecyclerViewAdapter);
        mainRecyclerViewAdapter.notifyDataSetChanged();
        mainRecyclerViewAdapter.setOnClickItemListener(new MainRecyclerViewAdapter.OnClickItemListener() {
            @Override
            public void onClick(String string, int position) {
                if (position == 0) {
                    Toast.makeText(getContext(), "本介面就是一個簡單的Recyclerview", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getContext(), "準備中的Recyclerview", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

BaseActivity是為了快速拿到當前介面的Context,也放在了common中,程式碼如下


/**
 * 上層基類
 * Created by ztn on 2017/3/28
 */
@SuppressLint("Registered")
public class BaseActivity extends AppCompatActivity {
     public BaseActivity getContext() {
        return this;
    }
}

接下來就是最重要的adapter。adapter確定了接收資料型別,確定了點選時需要用到的資料。


/**
 * Created by ztn on 2017/3/28
 */

public class MainRecyclerViewAdapter extends SimpleRecycleViewAdapter<String, MainRecyclerViewHolder> {
    private OnClickItemListener onClickItemListener;

//接收String型別資料
    public MainRecyclerViewAdapter(Context context, List<String> listData) {
        super(context, listData);
    }

    /**
     * 建立View
     *
     * @param parent
     * @return
     */
    @Override
    protected MainRecyclerViewHolder onCreateItemViewHolder(ViewGroup parent) {
        return new MainRecyclerViewHolder(inflater.inflate(R.layout.a_simple_text_view, parent, false));
    }

    public void setOnClickItemListener(OnClickItemListener onClickItemListener) {
        this.onClickItemListener = onClickItemListener;
    }

    /**
     * 給View設定資料
     *
     * @param mainRecyclerViewHolder
     * @param position
     */
    @Override
    protected void onBindItemViewHolder(MainRecyclerViewHolder mainRecyclerViewHolder, int position) {
        mainRecyclerViewHolder.initView(context, listData.get(position), onClickItemListener,position);
    }

    /**
     * 便於實現點選事件
     */

    public interface OnClickItemListener {
        void onClick(String string, int position);
    }
}

adapter對應的holder,我們在holder中對於接收到的資料進行處理,可以根據需求,在initView中加入需要的引數,這裡我對於資料,與資料點選,與資料所在位置進行了處理,目前需要這三個引數。

/**
 * Created by ztn on 2017/3/28
 */

public class MainRecyclerViewHolder extends RecyclerView.ViewHolder {
    TextView textView;

    public MainRecyclerViewHolder(View itemView) {
        super(itemView);
        textView = (TextView) itemView.findViewById(R.id.simple_tv);
    }

    public void initView(Context context, final String string, final MainRecyclerViewAdapter.OnClickItemListener onClickItemListener, final int position) {
        textView.setText(string);


        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onClickItemListener != null)
                    onClickItemListener.onClick(string, position);
            }
        });
    }
}

這樣我們就實現了一個簡單的列表。
最近在研究git,準備到時候提交一個完整的專案到上面以便於大家參照。到時候我會貼出專案地址。

專案地址

如有疑問大家可以新增 121606151 這個qq群@Crazy(即本人)即可,歡迎大家前來交流。