RecyclerAdapter set adapter position

瘦欲@ 提交于 2019-12-11 17:20:00

问题


We can show all records in the DB no issue. When we try to limit the items to show with a sql Select the search and the RecyclerView Adapter populates correctly. The code fails when the item is selected in the list view. The list view did not get the message about what position this record is at so the view when we navigate to the DetailActivity view from ListActivity is not the item in the ListView My question is how to manage the position variable that the Adapter is using? This code flow is as follows a button click on MainActivity sets the search variable goes to ListActivity that makes a call to DBHelper which returns to ListActivity with modelList which is and Array List Yes the design is MVP so we have a Model Class relevant code below

Main Activity btn Click

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

ListActivity call to DBHelper commented out line gets all data

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

DBHelper code to grab the selected record or records eventually

    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;
}

Now we use an intent to go to DetailsActivity and this is the fail

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);
   }
}

Thought about sending the data back from the DBHelper not sure how to write an Intent in that Class. This is turning into spaghetti code!


回答1:


The solution to this issue is the developer had multiple search designs in the DBHelper each being triggered by different buttons on the search Activity this design in the DBHelper lead to multiple ArrayLists all with the same name this drove the RecycleAdapter crazy as it is bound to ArrayList so OLD Mr. Boolean to the rescue! Here is the revised design code features In the Search Activity declare public static Boolean use = false; and Import where needed import static com..MainActivity.use;

Here is the code for each search button

    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 );
}

Now we do the desired Search in 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;
}

The only stumble with this is that if if you do a search by date and do an add to the DB and jump back to the ListActivity the new record is not displayed We are working on this Stay Tuned ha ha Good Job James_Duh




回答2:


You should set your OnClickListener here :

@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
        }
    });
}

instead of your ViewHolder because you shouldn't trust the adapter position at a time.



来源:https://stackoverflow.com/questions/46800449/recycleradapter-set-adapter-position

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!