У меня есть одна видимая проблема в моем приложении. Я нашел 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!!)
}
Итак, как я могу решить свою проблему?
да, это глобальная переменная, и затем я отправляю ее по своему запросу, и проблема в том, что значение, которое присваивается этой переменной, похоже на идентификатор задания в текущей позиции
Я попытался создать глобальный массив, заполненный идентификаторами заданий, но я не знаю, как получить идентификатор задания, на которое нажали.
Вы можете установить jobId как тег в представлении при настройке представления, а затем получить jobId выбранного представления.
Пример фрагмента будет выглядеть так:
myTextView.setText(job.getCompanyName());
....
myView.setTag(job.getId());
И затем, когда щелкнут вид, вы можете получить соответствующий jobId, используя
clickedJobId = myView.getTag();
где я должен создать этот тег? как вы знаете, я назначу этому tag
последний видимый элемент моего списка или нет?
поэтому я должен добавить невидимое поле в свой макет, где будет размещаться этот идентификатор?
Вы устанавливаете тег для представления при создании представления и отображении других сведений о задании.
Нет, вы можете добавить тег/теги к любому представлению. Теги не видны и не влияют на пользовательский интерфейс. Вы можете установить тег для всего фрагмента строки или текстового представления в этом фрагменте.
Посмотрите ссылку на документацию, которой я поделился в своем ответе.
это может быть textView? и как я могу отправить щелкнутый идентификатор задания? потому что для меня это похоже на мой метод, и последнее значение id будет последним элементом списка
при нажатии на определенное задание вы можете получить идентификатор из тега представления, а затем выполнить вызов API.
Давайте продолжить обсуждение в чате.
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);
Какова цель
jId
. как глобальная переменная?