簡體   English   中英

如何將數據從Recyclerview傳遞到新活動

[英]How to pass data from recyclerview to new activity

我正在嘗試找到一種解決方案,將數據從我的recyclerview適配器傳遞到新活動。 我做了很多研究,但沒有找到解決方案。 我知道我需要使用putExtra()但我不知道如何。

數據取自API,我已在CompaniesListActivity中顯示,但在此活動中,我只想顯示公司名稱,在公司描述中我想顯示其他名稱。 像這樣:

公司:Company1 Company2 Company3 Company4 Company5

當我單擊其中之一時,我會得到

說明nipt俱樂部

activity_company_description.xml

    <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".CompanyDescription">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/company_description"
        android:layout_width="395dp"
        android:layout_height="715dp"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="8dp" />

</android.support.constraint.ConstraintLayout>

row_company_description.xml

    <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="160dp"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/row_padding_vertical"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingBottom="@dimen/row_padding_vertical">

    <TextView
        android:id="@+id/tvCompanyDescription"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:layout_marginStart="10dp"
        android:layout_marginTop="3dp"
        android:layout_marginEnd="8dp"
        android:text="TextView"
        android:textSize="12sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.023"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tvCompanyName" />

    <TextView
        android:id="@+id/tvCompanyNipt"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_marginStart="10dp"
        android:layout_marginTop="3dp"
        android:layout_marginEnd="8dp"
        android:text="TextView"
        android:textSize="12sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tvCompanyDescription" />

    <TextView
        android:id="@+id/tvClubs"
        android:layout_width="wrap_content"
        android:layout_height="15dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:text="TextView"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tvCompanyNipt"
        app:layout_constraintVertical_bias="0.2"
        tools:layout_editor_absoluteX="5dp" />

</android.support.constraint.ConstraintLayout>

我的recyclerview適配器

    private Context context;

    public CompanyAdapter(Context context, Companies companies) {
        this.companies = companies;
        this.context = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.row_companies, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int position) {
        final Company comp = companies.getCompanies().get(position);

        viewHolder.compName.setText(comp.getCompany().getName());
        viewHolder.compDesc.setText(comp.getCompany().getDescription());
        viewHolder.compNipt.setText(comp.getCompany().getNipt());
        viewHolder.compClubs.setText(comp.getClubs().toString());

        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Company selectedCom = companies.getCompanies().get(position);
                Intent intent = new Intent(context, CompanyDescription.class);
                intent.putExtra("company", selectedCom);
                intent.putExtra("description", comp);
                intent.putExtra("nipt", comp);
                intent.putExtra("clubs", comp);
                context.startActivity(intent);
            }
        });
    }

    @Override
    public int getItemCount() {
        Integer rows = companies == null ? 0 : companies.getCompanies().size();
        return rows;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView compName, compDesc, compNipt, compClubs;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            compName = (TextView) itemView.findViewById(R.id.tvCompanyName);
            compDesc = (TextView) itemView.findViewById(R.id.tvCompanyDescription);
            compNipt = (TextView) itemView.findViewById(R.id.tvCompanyNipt);
            compClubs = (TextView) itemView.findViewById(R.id.tvClubs);

        }

    }

my CompaniesListActivity-> 

    private RecyclerView recyclerView;
    private RecyclerView.Adapter adapter;
    private UserService service;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_companies_list);
        CompaniesRetriver companiesRetriver = new CompaniesRetriver();
        this.recyclerView = (RecyclerView) findViewById(R.id.companies_list);
        SharedPreferences editor = getSharedPreferences(MY_PREFERENCE, MODE_PRIVATE);
        String token = editor.getString("token", "");
        final Context sfdsf = this;
        Callback<Companies> callback = new Callback<Companies>() {
            @Override
            public void onResponse(Call<Companies> call, Response<Companies> response) {
                if(response.isSuccessful()) {
                    Companies companies = response.body();
                    CompanyAdapter adapter = new CompanyAdapter(CompaniesListActivity.this, companies);
                    recyclerView.setLayoutManager(new LinearLayoutManager(CompaniesListActivity.this));
                    recyclerView.setAdapter(adapter);
                    System.out.println(companies);
                } else {
                    System.out.println(response.body());
                }
            }

            @Override
            public void onFailure(Call<Companies> call, Throwable t) {

                System.out.println(t.getLocalizedMessage());
            }
        };

        companiesRetriver.getCompanies(callback, token);

        recyclerView.addItemDecoration(
                new DividerItemDecoration(ContextCompat.getDrawable(getApplicationContext(),
                        R.drawable.item_separator)));
    }

and CompanyDescriptionActivity

   super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_company_description);
        Company ind = (Company) getIntent().getSerializableExtra("company");
        System.out.println(ind);
        CompaniesRetriver companiesRetriver = new CompaniesRetriver();
        this.recyclerView = (RecyclerView) findViewById(R.id.company_description);






嘗試這一希望對您有所幫助。

 Intent intent = new Intent(context, CompanyDescription.class);
            intent.putExtra("key", value);
            context.startActivity(intent);

在另一個活動中,您可以由此獲取數據

String value=getIntent().getStringExtra("key");

您要描述的是此處的“關注分離”問題

讓我們分析一下您有什么,對吧?

您的密碼

您有2個活動。 其中一個從API獲取數據列表,並將其顯示在列表中(這涉及創建適配器並滿足顯示列表的所有要求)。 此活動還用作其余活動的數據存儲庫,因為您將此列表存儲在列表活動中。 另一個活動旨在顯示物料(在您的示例中為Company )的詳細信息(在您的情況下為“描述”)。

問題

ListActivity無法將Company直接傳遞給CompanyDescription

你想做什么

  1. 將事物分解為較小的事物,因此您可以告訴事物僅執行“此事物,僅此而已”。 東西很多嗎?
  2. 隨時使用框架工具。

我會怎么做

  1. CompanyListActivity應該只負責列表; 展示並構建它,這就是它所需要知道的全部。
  2. CompanyListActivity將為RecyclerView擴充XML,將創建一個適配器並將數據請求到存儲庫(您將其稱為CompaniesRetriever ),因此Companies Retriever將在有數據時通知活動(您已經這樣做了,因為您通過了回調)。 您的實現存在問題,如果用戶加載此列表然后立即回擊,則在CompanyListActivity中看不到任何代碼來通知檢索器不再需要數據(因為用戶離開了活動)。 請注意這一點,因為如果您將任何上下文傳遞給所說的“獵犬”,則可能會發生內存泄漏。
  3. 到現在為止還挺好。 現在您有了清單。 這是我們倆做事不同的地方:

在此應用程序的我的版本中,CompaniesRetriever是一個單例類(只能有一個類,例如Highlander ),因此,您無需在Description活動中執行new CompaniesRetriever() ,而只需使用 CompaniesList活動相同的實例即可。

這帶來了一種新的可能性,即當Retriever(由於您未共享代碼而無法看到)接收到帶有數據的API回調並將其傳遞回CompaniesList(在您擁有的回調中)時,它就可以了保留此數據的本地副本 ,然后將其傳遞。

現在,當用戶點擊列表中的一項時,您無需傳遞全部內容,而只需通過intent.putString("Id", selectedCompany.getId() )將公司的“ id”(或唯一的標識它的名稱)傳遞給下一個活動intent.putString("Id", selectedCompany.getId() (ID可以是您想要的任何東西,只要它允許下一個活動唯一標識它即可)。

在NEXT活動中,您將獲得“選定的公司ID”,並使用一種簽名如下的新方法調用檢索器(該列表中包含所有正在存儲的公司的列表): public Company getCompanyById(String id) (偽代碼)明顯地)

檢索器所做的全部是:

public Company getCompanyById(String id) {
      listofCompanies.get(id) // I would use a hashMap for faster lookup
}

(如果您使用列表,則需要進行迭代,直到找到所需的內容為止;如果您有1000家公司,那很好,如果希望有巨大的數字,請考慮使用哈希表或更快的數據結構)

無論如何,最終結果是您新的“描述”活動無需過多擔心任何事情,它會收到一個ID並詢問數據。

這使這兩個活動都不必理會數據的來源,只需給它們提供所需的數據即可(流主要在一個方向上,這很好)。 活動要求提供數據,請不要提供。

我希望這可以幫助您重新考慮您的代碼,因為您已經准備好了大多數東西,所以無需進行大量更改。

XML呢?

我不確定100%知道從“那里”(您的話)訪問XML的意思,但是我認為您不需要它,因為您的想法是從要顯示的公司中讀取XML。列表,這是不可能的(從字面上看),也不是我提議的體系結構所必需的(據記錄,我沒有發明):D

希望這可以引導您朝更好的方向發展。

祝好運!

我會嘗試這樣做:

private Context context;
private onItemClickListener;

public CompanyAdapter(OnItemClickListener listener, Companies companies) {
    this.companies = companies;
    this.onItemClickListener = listener;
}

 public interface OnItemClickListener {
void OnItemClick(Companies companies)
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.row_companies, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int position) {
    final Company comp = companies.getCompanies().get(position);
  viewHolder.bind(comp, onItemClickListener);
}

@Override
public int getItemCount() {
    Integer rows = companies == null ? 0 : companies.getCompanies().size();
    return rows;
}

public class ViewHolder extends RecyclerView.ViewHolder {

    public TextView compName, compDesc, compNipt, compClubs;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        compName = (TextView) itemView.findViewById(R.id.tvCompanyName);
        compDesc = (TextView) itemView.findViewById(R.id.tvCompanyDescription);
        compNipt = (TextView) itemView.findViewById(R.id.tvCompanyNipt);
        compClubs = (TextView) itemView.findViewById(R.id.tvClubs);

    }

   public void bind (Companies comp, OnItemClickListener listener) {

compName.setText(comp.getCompany().getName());             
   compDesc.setText(comp.getCompany().getDescription());
compNipt.setText(comp.getCompany().getNipt());
compClubs.setText(comp.getClubs().toString());

itemView.setOnClickListener(new View.OnClickListener() {
  @Override
public void onClick(View v) {

onItemClickListener.OnItemClick(comp);
Context context = v.getContext;
            Intent intent = new Intent(context, CompanyDescription.class);
            intent.putExtra("company", selectedCom);
            intent.putExtra("description", comp);
            intent.putExtra("nipt", comp);
            intent.putExtra("clubs", comp);
            context.startActivity(intent);
        }
    });
   }

}

由於如此混亂,我找到了一種顯示數據的簡單方法,所以我決定不使用recyclerview,而是使用更簡單的方法。 現在一切正常。

Intent intent = getIntent();
    company = (Company) intent.getSerializableExtra("company");

    tvCompanyName = (TextView) findViewById(R.id.tvCompanyName);
    tvCompanyDescription = (TextView) findViewById(R.id.tvCompanyDescription);
    tvCompanyNipt = (TextView) findViewById(R.id.tvCompanyNipt);

    tvCompanyName.setText(company.getCompany().getName());
    tvCompanyDescription.setText(company.getCompany().getDescription());
    tvCompanyNipt.setText(company.getCompany().getNipt());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM