2016-07-13 16 views
1

Ich habe eine Recyclerview. wie diesRecyclerview pflegen das angeklickte Element hervorgehoben - Android

enter image description here

Wenn ein Benutzer eine Zeile klickt, dass bestimmte Zeile wird mit der Grundfarbe hervorgehoben, aber wenn der Benutzer die Finger aus dauert es zurück zu transparent bekommen.

Aber was ich will, ist, möchte ich die zuletzt angeklickte Zeile hervorgehoben halten, auch nachdem der Benutzer den Finger nimmt.

Profilliste Row

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginBottom="10dp" 
    android:focusable="true" 
    android:paddingLeft="16dp" 
    android:paddingRight="16dp" 
    android:paddingTop="10dp" 
    android:paddingBottom="10dp" 
    android:clickable="true" 
    android:background="@drawable/recyclerview_selector" 
    android:orientation="vertical"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceSmall" 
     android:text="Small Text" 
     android:id="@+id/tv_companyName" 
     android:textColor="@color/colorHeaderText" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_toLeftOf="@+id/txt_bar" 
     android:layout_toStartOf="@+id/txt_bar" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceSmall" 
     android:text="|" 
     android:id="@+id/txt_bar" 
     android:textColor="@color/colorHeaderBorder" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceSmall" 
     android:text="Small Text" 
     android:id="@+id/tv_helpDeskName" 
     android:textColor="@color/colorHeaderText" 
     android:layout_alignParentTop="true" 
     android:layout_toRightOf="@+id/txt_bar" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:layout_marginLeft="10dp" /> 
</RelativeLayout> 

Recycler_view_selector

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true"> 
     <shape> 
      <solid android:color="@color/colorPrimaryDark" /> 
     </shape> 
    </item> 

    <item android:state_pressed="false"> 
     <shape> 
      <solid android:color="@android:color/transparent" /> 
     </shape> 
    </item> 
    <item android:state_activated="true" 
     android:drawable="@color/colorPrimaryDark" /> 
</selector> 

activity_profile

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:background="@color/colorWhite" 
    tools:context="com.example.baman.zupportdesk.CompanyProfile"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceSmall" 
     android:text="@string/company_profile" 
     android:id="@+id/textView4" 
     android:textColor="@color/colorBlack" 
     android:textSize="16dp" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_marginLeft="10dp" 
     android:layout_marginTop="5dp" /> 


    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginTop="40dp" 
     android:layout_alignTop="@+id/textView4" 
     android:layout_alignParentLeft="true" 
     android:background="@color/colorWhite" 
     android:layout_alignParentStart="true" 
     android:weightSum="1"> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="45dp" 
      android:background="@drawable/recycler_view_round_corners"> 
      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textAppearance="?android:attr/textAppearanceSmall" 
       android:text="@string/company_name" 
       android:layout_marginLeft="18dp" 
       android:id="@+id/tv_companyName" 
       android:textColor="@color/colorHeaderText" 
       android:textStyle="bold" 
       android:textSize="18dp" 
       android:layout_marginTop="10dp" /> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textAppearance="?android:attr/textAppearanceSmall" 
       android:text="|" 
       android:id="@+id/txt_bar" 
       android:layout_alignParentTop="true" 
       android:layout_centerHorizontal="true" 
       android:textSize="18dp" 
       android:textColor="@color/colorHeaderBorder" 
       android:layout_marginTop="10dp" /> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textAppearance="?android:attr/textAppearanceSmall" 
       android:text="@string/help_desk_name" 
       android:id="@+id/tv_helpDeskName" 
       android:layout_alignParentTop="true" 
       android:layout_toRightOf="@+id/txt_bar" 
       android:layout_alignParentRight="true" 
       android:layout_alignParentEnd="true" 
       android:layout_marginLeft="10dp" 
       android:textStyle="bold" 
       android:textColor="@color/colorHeaderText" 
       android:textSize="18dp" 
       android:layout_marginTop="10dp" /> 
     </RelativeLayout> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recycler_view" 
      android:layout_width="match_parent" 
      android:layout_height="292dp" 
      android:background="@drawable/recycler_view_bottom_corners" 
      android:scrollbars="vertical" 
      android:layout_weight="0.57" /> 

    </LinearLayout> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@drawable/button_style" 
     android:textColor="@color/colorWhite" 
     android:text="@string/submit" 
     android:id="@+id/button2" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:textStyle="bold" /> 

</RelativeLayout> 

Adapter

/** 
* Created by baman on 6/25/16. 
*/ 

import android.graphics.Color; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.util.SparseBooleanArray; 
import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 
import com.example.baman.zupportdesk.R; 

import java.util.ArrayList; 
import java.util.List; 

public class CompanyProfileAdapter extends RecyclerView.Adapter<CompanyProfileAdapter.MyViewHolder>{ 
    private List<CompanyProfileData> companyProfileDataList; 
    private SparseBooleanArray selectedItems; 

    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     public TextView comName, hdName; 

     public MyViewHolder(View view) { 
      super(view); 

      comName = (TextView) view.findViewById(R.id.tv_companyName); 
      hdName = (TextView) view.findViewById(R.id.tv_helpDeskName); 

      comName.setOnClickListener(this); 
      hdName.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      int position = getAdapterPosition(); 
      Log.d("clicked Position", String.valueOf(position)); 
      Log.d("clicked company name",String.valueOf(comName.getText().toString())); 
      Log.d("clicked hd name",String.valueOf(hdName.getText().toString())); 
     } 


    } 

    public CompanyProfileAdapter(List<CompanyProfileData> companyList) { 
     this.companyProfileDataList = companyList; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.company_profile_list_row, parent, false); 
     return new MyViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     CompanyProfileData CPData = companyProfileDataList.get(position); 
     holder.comName.setText(CPData.getComName()); 
     holder.hdName.setText(CPData.gethdName()); 


    } 

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

Profiledata

/** 
* Created by baman on 6/25/16. 
*/ 
public class CompanyProfileData { 
    /* comName - Company Name 
    * hdName - Help Desk Name */ 
    private String comName, hdName; 

    public CompanyProfileData(String comName, String hdName) { 
     this.comName = comName; 
     this.hdName = hdName; 
    } 

    public String getComName(){ 
     return comName; 
    } 
    public String gethdName(){ 
     return hdName; 
    } 
    public void setcomName(String name){ 
     this.comName = name; 
    } 
    public void sethdName(String hdname){ 
     this.hdName = hdname; 
    } 
} 

Activity_profile

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 

import com.example.baman.zupportdesk.Data.CompanyProfileAdapter; 
import com.example.baman.zupportdesk.Data.CompanyProfileData; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.ArrayList; 
import java.util.List; 

public class CompanyProfile extends Activity { 

    private List<CompanyProfileData> CompanyProfileList = new ArrayList<>(); 
    private RecyclerView recyclerView; 
    private CompanyProfileAdapter mAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_company_profile); 

     Intent intent = getIntent(); 
     String company_data = intent.getStringExtra("companyData"); 
     Log.d("Company data", company_data); 

     recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
     mAdapter = new CompanyProfileAdapter(CompanyProfileList); 
     RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); 
     recyclerView.setLayoutManager(mLayoutManager); 
     recyclerView.setAdapter(mAdapter); 

     try { 
      prepareCompanyProfileData(company_data); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void prepareCompanyProfileData(String company_data) throws JSONException { 
     CompanyProfileData CompanyData ; 
     JSONArray jsonArray = new JSONArray(company_data); 
     int count = jsonArray.length(); 
     for(int i = 0; i< jsonArray.length();i++) { 
      JSONObject jsonObject = jsonArray.getJSONObject(i); 
      CompanyData = new CompanyProfileData(jsonObject.getString("CompanyName"), jsonObject.getString("CompanyName")); 
      CompanyProfileList.add(CompanyData); 
     } 
     mAdapter.notifyDataSetChanged(); 
    } 
} 
+1

Sie können versuchen [Beispiel] (http://inducesmile.com/android/how-to-set-recycleview-item-row-background-color-in-android/) –

+0

für ähnliche Beispiel, versuchen Sie es https://stackoverflow.com/a/46677018/1308990 – oiyio

Antwort

1

Zuerst instanziieren Sie selectedItems in Ihrem Konstruktor wie folgt.

public CompanyProfileAdapter(List<CompanyProfileData> companyList) { 
     this.companyProfileDataList = companyList; 
     selectedItems = new SparseBooleanArray(); 
} 

Dann erstellen Sie einen Methodenaufruf selectLastItem() oder mit dem gewünschten Namen wie unten.

public void selectLastItem(int pos){ 
     selectedItems.clear(); 
     selectedItems.put(pos, true); 
     notifyDataSetChanged(); 
} 

Und dann ändern Sie Ihre onBindViewHolder() -Methode wie folgt.

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
     CompanyProfileData CPData = companyProfileDataList.get(position); 
     holder.comName.setText(CPData.getComName()); 
     holder.hdName.setText(CPData.gethdName()); 
     holder.itemView.setBackgroundColor(selectedItems.get(position, false) ? ResourcesCompat.getColor(holder.itemView.getResources(), R.color.colorPrimary, null) : Color.TRANSPARENT); 
} 

Schließlich rufen Sie die selectLastItem-Methode in OnClick() wie folgt auf.

@Override 
public void onClick(View v) { 
     selectLastItem(getAdapterPosition()); 
} 

Ich denke, das wird Ihr Problem lösen. Danke ..

+0

Danke, das funktioniert. Wenn jedoch auf ein zweites Objekt geklickt wird, wird das zuvor angeklickte Objekt nicht entfernt. –

+0

Ok.Bitte ändere die notifyItemChanged (pos); to notifyDataSetChanged(); Ich habe den Code auch bearbeitet. Bitte informieren Sie uns und lassen Sie uns wissen, ob es funktioniert. – TdSoft

+0

Danke. Es funktioniert gut. –

0

Innen öffentlichen MyViewHolder Ihres Adapter (Ansicht Ansicht)
: Schreibe:

+0

hy. versuchte das hier. es hat nicht funktioniert. –

+0

haben Sie versucht, setSelected (true) in Ihrem onclick Listener? –

+0

ja. Ich habe das auch versucht, ich habe nicht gearbeitet. –