Как присвоить идентификатор определенному элементу recyclerView android?

У меня есть одна видимая проблема в моем приложении. Я нашел API и научился работать с модифицированной библиотекой. С помощью этого API я получаю список заданий с одного сайта и представляю их в recyclerview, который основан на пользовательском адаптере. В этот recyclerView я отправляю jobs: ArrayList<JobModel> и создал JobModel, который является моим модельным классом. Затем в onBindViewHolder :

val jobModel = jobs[position]

и вот мой модельный класс:

public class JobModel {
    @SerializedName("company_name")
    @Expose
    private String company_name;

    @SerializedName("lastdate")
    @Expose
    private String lastdate;

    @SerializedName("id")
    @Expose
    private int id;

    @SerializedName("position")
    @Expose
    private String position;

    @SerializedName("location")
    @Expose
    private String location;

    @SerializedName("job_link")
    @Expose
    private String job_link;

    @SerializedName("seen")
    @Expose
    private boolean seen;

    public JobModel(String company_name, String lastdate, int id, String position, String location, String job_link, boolean seen) {
        this.company_name = company_name;
        this.lastdate = lastdate;
        this.id = id;
        this.position = position;
        this.location = location;
        this.job_link = job_link;
        this.seen = seen;
    }

    public String getCompany_name() {
        return company_name;
    }

    public String getLastdate() {
        return lastdate;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }

    public String getLocation() {
        return location;
    }

    public String getJob_link() {
        return job_link;
    }
    public boolean isSeen() {
        return seen;
    }
}

проблема в том, что я должен пометить выбранную работу как видимую, для этого я должен отправить запрос с идентификатором выбранной работы, но я отправляю идентификатор последнего видимого элемента списка. Я понимаю, почему это происходит, но я не представляю, как решить эту проблему. Это происходит потому, что я создал глобальную переменную id:

var jId: Int? = 0

а затем в onBindViewHolder я присваиваю значение этой переменной:

val jobModel = jobs[position]
jId = jobModel.id

и когда я щелкаю список элементов, он отправляет запрос с последним видимым элементом в моем recyclerView. Поэтому я могу предложить только одно решение - создать массив, который будет заполняться идентификаторами заданий, а затем, когда я нажму на одно из заданий, я получу элемент по позиции, а затем отправлю запрос. Работа с кликами:

holder.itemView.setOnClickListener(this) 

тогда:

override fun onClick(p0: View?) {
        Singleton.clickReq(jId, ctx)
        click.sendData(url, pos!!, jobTitle!!)
    }

Итак, как я могу решить свою проблему?

Какова цель jId . как глобальная переменная?

Swayam 22.05.2019 15:40

да, это глобальная переменная, и затем я отправляю ее по своему запросу, и проблема в том, что значение, которое присваивается этой переменной, похоже на идентификатор задания в текущей позиции

Andrew 22.05.2019 15:43

Я попытался создать глобальный массив, заполненный идентификаторами заданий, но я не знаю, как получить идентификатор задания, на которое нажали.

Andrew 22.05.2019 15:44
0
3
2 215
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете установить jobId как тег в представлении при настройке представления, а затем получить jobId выбранного представления.

Пример фрагмента будет выглядеть так:

myTextView.setText(job.getCompanyName());
....
myView.setTag(job.getId());

И затем, когда щелкнут вид, вы можете получить соответствующий jobId, используя

clickedJobId = myView.getTag();

где я должен создать этот тег? как вы знаете, я назначу этому tag последний видимый элемент моего списка или нет?

Andrew 22.05.2019 15:47

поэтому я должен добавить невидимое поле в свой макет, где будет размещаться этот идентификатор?

Andrew 22.05.2019 15:48

Вы устанавливаете тег для представления при создании представления и отображении других сведений о задании.

Swayam 22.05.2019 15:48

Нет, вы можете добавить тег/теги к любому представлению. Теги не видны и не влияют на пользовательский интерфейс. Вы можете установить тег для всего фрагмента строки или текстового представления в этом фрагменте.

Swayam 22.05.2019 15:49

Посмотрите ссылку на документацию, которой я поделился в своем ответе.

Swayam 22.05.2019 15:49

это может быть textView? и как я могу отправить щелкнутый идентификатор задания? потому что для меня это похоже на мой метод, и последнее значение id будет последним элементом списка

Andrew 22.05.2019 15:50

при нажатии на определенное задание вы можете получить идентификатор из тега представления, а затем выполнить вызов API.

Swayam 22.05.2019 15:51

Давайте продолжить обсуждение в чате.

Andrew 22.05.2019 15:52
public class JobListAdapter extends RecyclerView.Adapter<JobListAdapter.JobViewHolder> {

    private Context mContext;
    private ArrayList<JobModel> mJobList = new ArrayList<>();


    public JobListAdapter(Context context) {
        mContext = context;
    }

    public void setJobList(ArrayList<JobModel> jobList) {
        mJobList = jobList;
    }

    @Override
    public JobViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_job_list, parent, false);

        JobViewHolder viewHolder = new JobViewHolder(view);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(JobViewHolder holder, final int position) {
        final JobViewHolder wHolder = holder;

        //. you can get the item here
        JobModel jobModel = mJobList.get(position);

        holder.itemView.setOnTouchListener(new View.OnTouchListener() {
           @Override
           public boolean onTouch(View v, MotionEvent event) {

               return false;
           }
        });

    }

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

    public class JobViewHolder extends RecyclerView.ViewHolder {

        private View mItemView;
        private TextView mTextView;

        public JobViewHolder(View itemView) {
            super(itemView);

            mItemView = itemView;
            mTextView = (TextView) itemView.findViewById(R.id.text_view);

        }
   }

}

//. item_job_list.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:orientation = "vertical">

    <LinearLayout
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:orientation = "vertical">

        <TextView
            android:id = "@+id/text_view"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:text = ""
            android:textSize = "16sp" />        

    </LinearLayout>

</LinearLayout>

используйте такой код

private RecyclerView mJobRecyclerView;
private JobListAdapter mJobListAdapter;

mJobListAdapter = new JobListAdapter(this);    

ArrayList<JobModel> jobList = new ArrayList<>();
//. add job
JobModel jobmodel = new JobModel();
jobList.add(jobmodel);

mJobListAdapter.setJobList(jobList);

mJobRecyclerView.setAdapter(mJobListAdapter);

Другие вопросы по теме

Запустить другой класс из адаптера с помощью Intent?
Есть ли какая-нибудь библиотека, из которой мы можем получить эффект выделения в recyclerview (например, изображения прокрутки страницы hotstar vip)?
Несколько кнопок RecycleView должны удерживать идентификатор пользователя из залпа и отправлять идентификатор пользователя в базу данных при нажатии кнопок
Обработка пустого средства просмотра повторного использования внутри фрагментов
Беспорядок при изменении цвета специального предмета
Пользовательский ViewHolder ClassCastException не может быть преобразован в другой Viewholder
Как использовать библиотеку пейджинга вместо обычного адаптера и recyclerview?
Последний элемент в списке в RecycleView имеет неправильное положение
Отображение массива SQLite DB в RecyclerView продолжает падать
Как я могу поместить две разные переменные внутри текстового представления в recyclerview, когда оно запускается во второй раз?