RecyclerAdapter设置适配器位置

时间:2017-10-17 22:58:35

标签: android sqlite recycler-adapter

我们可以在数据库中显示所有记录没有问题。当我们尝试限制要使用sql显示的项目时选择搜索并正确填充RecyclerView适配器。 在列表视图中选择项目时代码失败。列表视图没有得到关于此记录的位置的消息,因此当我们从ListActivity导航到DetailActivity视图时,视图不是ListView中的项目 我的问题是如何管理适配器使用的位置变量? 这个代码流如下按钮点击MainActivity设置搜索变量转到ListActivity,它调用DBHelper,返回ListActivity with modelList和Array List是设计是MVP所以我们在下面有一个Model Class相关代码< / p>

主要活动btn点击

    public void findAllData(View view){
    selectSTRING = etFromDate.getText().toString();
    Intent intent = new Intent( MainActivity.this, ListActivity.class );
    startActivity( intent );
}

ListActivity调用DBHelper注释掉行获取所有数据

        helpher = new DBHelper(this);
    dbList = new ArrayList<>();
    dbList = helpher.getRangeDataFromDB();
    //dbList = helpher.getDataFromDB();

DBHelper代码最终获取所选记录

    public List<DBModel> getRangeDataFromDB() {
    List<DBModel> modelList = new ArrayList<>();
    db = this.getReadableDatabase();
    String query = "SELECT * FROM " + TABLE_INFO + " WHERE " + Col_PURCHASE_DATE + " ='" + selectSTRING + "'";
    Cursor cursor = db.rawQuery(query, null);
    //Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_INFO + " WHERE " + Col_PURCHASE_DATE + "='" + str + "'" , null);
    String newBACK = selectSTRING;

    if (cursor.moveToFirst()) {
        DBModel model = new DBModel();

        while (!cursor.isAfterLast()) {
            if (newBACK == selectSTRING) {
                model.setRowid(cursor.getString(0));
                model.setStation_Name(cursor.getString(1));
                model.setDate_of_Purchase(cursor.getString(2));
                model.setGas_Cost(cursor.getString(3));
                modelList.add(model);
                cursor.moveToNext();
            }
        }
    }
    int sz = modelList.size();
    System.out.println("========= SIZE "+sz);
    db.close();
    return modelList;
}

现在我们使用intent转到DetailsActivity,这是失败

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

static List<DBModel> dbList;
static private Context context;

RecyclerAdapter(Context context, List<DBModel> dbList) {

    RecyclerAdapter.dbList = new ArrayList<>();
    RecyclerAdapter.context = context;
    RecyclerAdapter.dbList = dbList;
}

@Override
public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_row, null);

    // create ViewHolder
    ViewHolder viewHolder = new ViewHolder(itemLayoutView);
    return viewHolder;
}

@Override
public void onBindViewHolder(RecyclerAdapter.ViewHolder holder, int position) {

    holder.rowid.setText(dbList.get(position).getRowid());
    holder.station.setText(dbList.get(position).getStation_Name());
    System.out.println("========== new position "+position);


}

@Override
public int getItemCount() {
    return dbList.size();
}

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public TextView station, rowid;

    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);
        rowid = (TextView) itemLayoutView.findViewById(R.id.rvROWID);
        station = (TextView) itemLayoutView.findViewById(R.id.rvSTATION);
        // Attach a click listener to the entire row view
        itemLayoutView.setOnClickListener(this);

    }

   @Override // When an item in DetailsActivity is touched (selected) the RecyclerView has
    //  a OnClickListener attached in the above Code that implements the method below
    public void onClick(View v) {
        System.out.println("======RowID "+rowid);
       Intent intentN = new Intent(context, DetailsActivity.class);
       Bundle extras = new Bundle();
       extras.putInt("POSITION", getAdapterPosition());
       extras.putString("FROM_LIST_ACTIVITY", "false");
       ///position = getAdapterPosition();
       ///position = getLayoutPosition();// Both work the same
       intentN.putExtras(extras);
       context.startActivity(intentN);
   }
}

考虑从DBHelper发回数据,不知道如何在该类中编写Intent。这变成了意大利面条代码!

2 个答案:

答案 0 :(得分:1)

这个问题的解决方案是开发人员在DBHelper中有多个搜索设计,每个搜索设计都由搜索活动中的不同按钮触发。此设计在DBHelper中导致多个ArrayLists都具有相同的名称,这使得RecycleAdapter疯狂,因为它是绑定到ArrayList所以OLD先生布尔要抢救!这是修改后的设计代码功能 在Search Activity中声明public static Boolean use = false; 和导入所需的导入静态com..MainActivity.use;

以下是每个搜索按钮的代码

    public void findAllData(View view){
    helper = new DBHelper(this);
    helper.getDataFromDB();
    use = false;
    // Set Mr. Boolean
    Intent intent = new Intent( MainActivity.this, ListActivity.class );
    // ListActivity shows Results of the Search
    startActivity( intent );
}

public void findSelect(View v){
    selectSTRING = etFromDate.getText().toString();
    // Get your Search variable
    helper = new DBHelper(this);
    helper.getDataFromDB();
    etToDate.setText(sendBACK);
    use = true;
    Intent intent = new Intent( MainActivity.this, ListActivity.class );
    startActivity( intent );
}

现在我们在DBHelper中进行所需的搜索

    /* Retrive ALL data from database table named "TABLE_INFO" */
public List<DBModel> getDataFromDB(){
    //String query = "SELECT * FROM " + TABLE_INFO + " WHERE " + Col_PURCHASE_DATE + " > 0 " + " ORDER BY " + Col_ID + " DESC ";
    /* Notice the SPACES before AND after the words WHERE ORDER BY ASC or DESC most of all the condition " > 0 "*/
    /* =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=*/
   Cursor cursor = null;
    List<DBModel> modelList = new ArrayList<>();
    if(use == true){
        String query = "SELECT * FROM " + TABLE_INFO + " WHERE " + Col_PURCHASE_DATE + " ='" + selectSTRING + "'";
        db = this.getWritableDatabase();
        cursor = db.rawQuery(query,null);
    }
    if(use == false){
        String query = "SELECT * FROM " + TABLE_INFO;
        db = this.getWritableDatabase();
        cursor = db.rawQuery(query,null);
    }

    if (cursor.moveToFirst()){

        do {
            DBModel model = new DBModel();
            model.setRowid(cursor.getInt(0));
            model.setStation_Name(cursor.getString(1));
            model.setDate_of_Purchase(cursor.getString(2));
            model.setGas_Cost(cursor.getString(3));
            modelList.add(model);

            int sz = modelList.size();
            int out =   model.setRowid(cursor.getInt(0));
            String out1 =  model.setStation_Name(cursor.getString(1));
            String out2 =  model.setDate_of_Purchase(cursor.getString(2));
            String out3 = model.setGas_Cost(cursor.getString(3));
            System.out.println("==============getDataFromDB ID "+out);
            System.out.println("==============getDataFromDB Station "+out1);
            System.out.println("==============getDataFromDB Date "+out2);
            System.out.println("==============getDataFromDB Cost "+out3);
            System.out.println("======= ======getDataFromDB SIZE "+sz);

        }while (cursor.moveToNext());
    }
    db.close();
    cursor.close();
    return modelList;
}

唯一的失误是,如果按日期搜索并对数据库进行添加并跳回ListActivity,则不会显示新记录 我们正在努力这个Stay Tuned ha ha Good Job James_Duh

答案 1 :(得分:0)

您应该在此处设置OnClickListener:

@Override
public void onBindViewHolder(ReportAdapter.ViewHolderReport holder, int position) {
    final Object object = objects.get(position);
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           // Do Something with the object at this position
        }
    });
}

代替您的ViewHolder,因为您不应该一次信任适配器位置。