Custom Listview Android

Custom Listview Adapter with filter Android

You can use the Filterable interface on your Adapter, have a look at the example below:

public class SearchableAdapter extends BaseAdapter implements Filterable {

private List<String>originalData = null;
private List<String>filteredData = null;
private LayoutInflater mInflater;
private ItemFilter mFilter = new ItemFilter();

public SearchableAdapter(Context context, List<String> data) {
this.filteredData = data ;
this.originalData = data ;
mInflater = LayoutInflater.from(context);
}

public int getCount() {
return filteredData.size();
}

public Object getItem(int position) {
return filteredData.get(position);
}

public long getItemId(int position) {
return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
// A ViewHolder keeps references to children views to avoid unnecessary calls
// to findViewById() on each row.
ViewHolder holder;

// When convertView is not null, we can reuse it directly, there is no need
// to reinflate it. We only inflate a new View when the convertView supplied
// by ListView is null.
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);

// Creates a ViewHolder and store references to the two children views
// we want to bind data to.
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.list_view);

// Bind the data efficiently with the holder.

convertView.setTag(holder);
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
holder = (ViewHolder) convertView.getTag();
}

// If weren't re-ordering this you could rely on what you set last time
holder.text.setText(filteredData.get(position));

return convertView;
}

static class ViewHolder {
TextView text;
}

public Filter getFilter() {
return mFilter;
}

private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {

String filterString = constraint.toString().toLowerCase();

FilterResults results = new FilterResults();

final List<String> list = originalData;

int count = list.size();
final ArrayList<String> nlist = new ArrayList<String>(count);

String filterableString ;

for (int i = 0; i < count; i++) {
filterableString = list.get(i);
if (filterableString.toLowerCase().contains(filterString)) {
nlist.add(filterableString);
}
}

results.values = nlist;
results.count = nlist.size();

return results;
}

@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredData = (ArrayList<String>) results.values;
notifyDataSetChanged();
}

}
}

In your Activity or Fragment where of Adapter is instantiated :

editTxt.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
System.out.println("Text ["+s+"]");

mSearchableAdapter.getFilter().filter(s.toString());
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {

}

@Override
public void afterTextChanged(Editable s) {
}
});

Here are the links for the original source and another example

Android custom Row Item for ListView

Add this row.xml to your layout folder

<?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="match_parent"
android:orientation="vertical" >

<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Header"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text"/>


</LinearLayout>

make your main xml layout as this

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >

<ListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ListView>

</LinearLayout>

This is your adapter

class yourAdapter extends BaseAdapter {

Context context;
String[] data;
private static LayoutInflater inflater = null;

public yourAdapter(Context context, String[] data) {
// TODO Auto-generated constructor stub
this.context = context;
this.data = data;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return data.length;
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return data[position];
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View vi = convertView;
if (vi == null)
vi = inflater.inflate(R.layout.row, null);
TextView text = (TextView) vi.findViewById(R.id.text);
text.setText(data[position]);
return vi;
}
}

Your java activity

public class StackActivity extends Activity {

ListView listview;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listview = (ListView) findViewById(R.id.listview);
listview.setAdapter(new yourAdapter(this, new String[] { "data1",
"data2" }));
}
}

the results

Sample Image

Android: Get data insert in custom listview

First take a list_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">

<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="#b5b5b5"
android:dividerHeight="1dp"
android:listSelector="@drawable/list_selector" />

</LinearLayout>

list_row.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#dedbdc"
android:orientation="horizontal"
android:padding="5dip" >

<!-- User Name-->
<TextView
android:id="@+id/userName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Rama"
android:textColor="#040404"
android:typeface="sans"
android:textSize="15dip"
android:textStyle="bold"/>

<!-- age -->
<TextView
android:id="@+id/age"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/userName"
android:textColor="#343434"
android:textSize="10dip"
android:layout_marginTop="1dip"
android:text="Just gona stand there and ..." />

<!-- Rightend info -->
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_dialog_info"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"/>

</RelativeLayout>

DataModel.java

public class DataModel {

private String name;
private String age;
private String website;

public DataModel(String name, String age, String website) {
this.name = name;
this.age = age;
this.website = website;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAge() {
return age;
}

public void setAge(String age) {
this.age = age;
}

public String getWebsite() {
return website;
}

public void setWebsite(String website) {
this.website = website;
}
}

CustomAdapter.java:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

public class CustomAdapter extends ArrayAdapter<DataModel> {

private ArrayList<DataModel> dataSet;
Context mContext;

// View lookup cache
private static class ViewHolder {
TextView txtName;
TextView txtAge;
}

public CustomAdapter(ArrayList<DataModel> data, Context context) {
this.dataSet = data;
this.mContext = context;
}

private int lastPosition = -1;

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Get the data item for this position
DataModel dataModel = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
ViewHolder viewHolder; // view lookup cache stored in tag

final View result;

if (convertView == null) {

viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.list_row, parent, false);
viewHolder.txtName = (TextView) convertView.findViewById(R.id.userName);
viewHolder.txtAge = (TextView) convertView.findViewById(R.id.age);

result = convertView;

convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
result = convertView;
}
lastPosition = position;

viewHolder.txtName.setText(dataModel.getName());
viewHolder.txtAge.setText(dataModel.getAge());

// Return the completed view to render on screen
return convertView;
}
}

MainActivity.java:

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toolbar;

import com.geeklabs.rssprarthana.DataModel;
import com.geeklabs.rssprarthana.R;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

ArrayList<DataModel> dataModels;
ListView listView;
private static CustomAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

listView=(ListView)findViewById(R.id.list);

dataModels= new ArrayList<>();

// TO DO add your list data here for example
dataModels.add(new DataModel("Shylendra", "25","http://facebook.com"));

adapter= new CustomAdapter(dataModels,getApplicationContext());

listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

DataModel dataModel= dataModels.get(position);

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(dataModel.getWebsite()));
startActivity(browserIntent);
}
});
}

}

Custom ListView Adapter Android

I do a try, and I'm without editor so please give me a feedback.

Try using this layout: your textview is smaller than the height of the text probably

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_custom_lvadapter"
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:orientation="vertical">
<!-- I removed the weightsum because this linearlayout is containing only a single item. If you have more items tell me and I will edit it -->

<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:weightSum="1"
android:orientation="horizontal" >

<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.7"
android:orientation="vertical" >
<!-- replaced width with 0dp also here -->

<TextView
android:id="@+id/currencyNameTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15dp"
android:text="text"/>

<TextView
android:id="@+id/currencyCodeTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15px"
android:textSize="18dp"
android:text="text"/>

</LinearLayout>

<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.3"
android:orientation="vertical"
android:layout_gravity="center_horizontal" >

<TextView
android:id="@+id/currencyRateTV"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="text"
android:textSize="30dp"
android:layout_marginLeft="15px"
android:layout_marginTop="15px"
android:gravity="center_horizontal" />

</LinearLayout>

</LinearLayout>

Custom Adapter for List View

public class ListAdapter extends ArrayAdapter<Item> {

private int resourceLayout;
private Context mContext;

public ListAdapter(Context context, int resource, List<Item> items) {
super(context, resource, items);
this.resourceLayout = resource;
this.mContext = context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

View v = convertView;

if (v == null) {
LayoutInflater vi;
vi = LayoutInflater.from(mContext);
v = vi.inflate(resourceLayout, null);
}

Item p = getItem(position);

if (p != null) {
TextView tt1 = (TextView) v.findViewById(R.id.id);
TextView tt2 = (TextView) v.findViewById(R.id.categoryId);
TextView tt3 = (TextView) v.findViewById(R.id.description);

if (tt1 != null) {
tt1.setText(p.getId());
}

if (tt2 != null) {
tt2.setText(p.getCategory().getId());
}

if (tt3 != null) {
tt3.setText(p.getDescription());
}
}

return v;
}

}

This is a class I had used for my project. You need to have a collection of your items which you want to display, in my case it's <Item>. You need to override View getView(int position, View convertView, ViewGroup parent) method.

R.layout.itemlistrow defines the row of the ListView.

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" android:orientation="vertical"
android:layout_width="fill_parent">

<TableRow android:layout_width="fill_parent"
android:id="@+id/TableRow01"
android:layout_height="wrap_content">

<TextView android:textColor="#FFFFFF"
android:id="@+id/id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="id" android:textStyle="bold"
android:gravity="left"
android:layout_weight="1"
android:typeface="monospace"
android:height="40sp" />
</TableRow>

<TableRow android:layout_height="wrap_content"
android:layout_width="fill_parent">

<TextView android:textColor="#FFFFFF"
android:id="@+id/categoryId"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="categoryId"
android:layout_weight="1"
android:height="20sp" />

<TextView android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_weight="1"
android:textColor="#FFFFFF"
android:gravity="right"
android:id="@+id/description"
android:text="description"
android:height="20sp" />
</TableRow>

</TableLayout>

In the MainActivity define ListViewlike this,

ListView yourListView = (ListView) findViewById(R.id.itemListView);

// get data from the table by the ListAdapter
ListAdapter customAdapter = new ListAdapter(this, R.layout.itemlistrow, List<yourItem>);

yourListView .setAdapter(customAdapter);

Custom ListView Android

yes you can ...

MyList.java:

package com.TestActivity;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.SimpleAdapter;

public class MyList extends ListActivity {

final static ArrayList<HashMap<String, ?>> data = new ArrayList<HashMap<String, ?>>();

static{
HashMap<String, Object> row = new HashMap<String, Object>();
row.put("Icon", R.drawable.flags_albania);
row.put("Chance", "65%");
row.put("TeamID", "Albania");
data.add(row);
row = new HashMap<String, Object>();
row.put("Icon", R.drawable.flags_rpa);
row.put("Chance", "55%");
row.put("TeamID", "RPA");
data.add(row);
row = new HashMap<String, Object>();
row.put("Icon", R.drawable.flags_polska);
row.put("Chance", "100%");
row.put("TeamID", "Polska :)");
data.add(row);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SimpleAdapter adapter = new SimpleAdapter(this,
data,
R.layout.row,
new String[] {"Icon","Chance","TeamID"},
new int[] { R.id.imageView1, R.id.textView1,R.id.textView2});
setListAdapter(adapter);

}
}

res/layout/row.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="match_parent">
<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/icon" android:id="@+id/imageView1"/>
<TextView android:text="TextView" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
<TextView android:text="TextView" android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
</LinearLayout>

put pngs with flags to res/drawable-hdpi/

flags_albania.png
flags_rpa.png
flags_polska.png

and you will get smthing like this:

Sample Image

How to access to the items in a custom ListView

You can access any item before creating in getView() method of adapter. this method bind each items.

Custom Listview Adapter in Android implementation Problems

I solved the Problem wich was in my InsectListAdapter constructor wich set this.mContext to mContext instead of context

Custom ListView where all the images have the same size

Either you crop the images before setting to the listViewItem. Or you just use images with the same ratio.

But i assume you are looking for a easier solution. Just add scaleType="centerCrop"

<ImageView
android:id="@+id/spicture"
android:scaleType="centerCrop"
android:layout_width="97dp"
android:layout_height="60dp"
android:layout_marginBottom="3dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="10dp"
android:adjustViewBounds="true"
android:layout_marginTop="3dp" >

You can find more information about the scaleTypes here: http://www.techrepublic.com/article/clear-up-ambiguity-about-android-image-view-scale-types-with-this-guide/

Note fitXY will scale it to fit, but the original ratio will get lost.



Related Topics



Leave a reply



Submit