Как назначить идентификатор для определенного элемента recyclerView android? - PullRequest
0 голосов
/ 22 мая 2019

У меня есть одна видимая проблема в моем приложении.Я нашел API и обучить работе с модифицированной библиотекой.Через этот API-интерфейс я получаю список заданий с одного сайта и представляю их в программе переработчика, основанной на специальном адаптере.В этот реселлер ViewView я отправляю 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!!)
    }

Итак, как мне решить мою проблему?

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

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

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

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

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

clickedJobId = myView.getTag();
0 голосов
/ 22 мая 2019
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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...