Through this tip, I'll present the way to make this trick, after complete it, our own applications will seem smoother and better adapted to each type of device.
DEMO VIDEO:
Designing layouts
As you can see, the root layouts must include the same children views (ImageView and TextView in this case), it maybe different about root and other non-id views. With this design, after running program in phone/tablet, we will see effect!
Programmatically coding
AbsListView absListView = (AbsListView)findViewById(R.id.list_item);Set dummy data for ListView adapter, locate all views, we have full simple code for main Activity:
package devexchanges.info.gridviewistview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private AbsListView absListView;
private ArrayAdapter<AsiaCountry> adapter;
private ArrayList<AsiaCountry> countryArrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
absListView = (AbsListView)findViewById(R.id.list_item);
settingData();
adapter = new AbsListViewAdapter(this, R.layout.item_abslistview, countryArrayList);
absListView.setAdapter(adapter);
}
private void settingData() {
countryArrayList = new ArrayList<>();
countryArrayList.add(new AsiaCountry(R.mipmap.vietnam, "Vietnam", "Việt Nam"));
countryArrayList.add(new AsiaCountry(R.mipmap.afghanistan, "Afghanistan", "Áp-ga-nix-tan"));
countryArrayList.add(new AsiaCountry(R.mipmap.brunei, "Brunei", "Bru-nây"));
countryArrayList.add(new AsiaCountry(R.mipmap.cambodia, "Cambodia", "Cam-pu-chia"));
countryArrayList.add(new AsiaCountry(R.mipmap.china, "China", "Trung Quốc"));
countryArrayList.add(new AsiaCountry(R.mipmap.india, "India", "Ấn Độ"));
countryArrayList.add(new AsiaCountry(R.mipmap.indonesia, "Indonesia", "In-đô-nê-xi-a"));
countryArrayList.add(new AsiaCountry(R.mipmap.iran, "Iran", "I-ran"));
countryArrayList.add(new AsiaCountry(R.mipmap.japan, "Japan", "Nhật Bản"));
countryArrayList.add(new AsiaCountry(R.mipmap.laos, "Laos", "Lào"));
countryArrayList.add(new AsiaCountry(R.mipmap.north_korea, "North Korea", "Triều Tiên"));
countryArrayList.add(new AsiaCountry(R.mipmap.singapore, "Singapore", "Singapore"));
countryArrayList.add(new AsiaCountry(R.mipmap.south_korea, "South Korea", "Hàn Quốc"));
countryArrayList.add(new AsiaCountry(R.mipmap.taiwan, "Taiwan", "Đài Loan"));
countryArrayList.add(new AsiaCountry(R.mipmap.thailand, "Thailand", "Thái Lan"));
}
}
Like the normal ListView/GridView adapter, we extend it from ArrayAdapter or BaseAdapter. In this, I provide a ViewHolder class to get scroll smoother and showing a Dialog when each AbsListView item was clicked:
package devexchanges.info.gridviewistview;
import android.app.Activity;
import android.app.Dialog;
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.List;
public class AbsListViewAdapter extends ArrayAdapter<Asiacountry> {
private Activity activity;
private List<AsiaCountry> countries;
public AbsListViewAdapter(Activity context, int resource, List<AsiaCountry> objects) {
super(context, resource, objects);
this.activity = context;
this.countries = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
// If holder not exist then locate all view from UI file.
if (convertView == null) {
// inflate UI from XML file
convertView = inflater.inflate(R.layout.item_abslistview, parent, false);
// get all UI view
holder = new ViewHolder(convertView);
// set tag for holder
convertView.setTag(holder);
} else {
// if holder created, get tag from view
holder = (ViewHolder) convertView.getTag();
}
holder.flag.setImageResource(getItem(position).getFlagResource());
holder.countryName.setText(getItem(position).getName());
convertView.setOnClickListener(onClickListener(getItem(position), String.valueOf(position + 1)));
return convertView;
}
private View.OnClickListener onClickListener(final AsiaCountry country, final String pos) {
return new View.OnClickListener() {
@Override
public void onClick(View view) {
final Dialog dialog = new Dialog(activity);
dialog.setContentView(R.layout.layout_dialog);
dialog.setTitle("Selected Country");
TextView name = (TextView) dialog.findViewById(R.id.country_name);
TextView position = (TextView) dialog.findViewById(R.id.pos);
TextView viName = (TextView) dialog.findViewById(R.id.vi_name);
ImageView image = (ImageView) dialog.findViewById(R.id.image);
name.setText(country.getName());
viName.setText(country.getVietnameseName());
position.setText(pos);
image.setImageResource(country.getFlagResource());
dialog.show();
}
};
}
private static class ViewHolder {
private ImageView flag;
private TextView countryName;
public ViewHolder(View v) {
flag = (ImageView) v.findViewById(R.id.flag);
countryName = (TextView) v.findViewById(R.id.country_name);
}
}
}
Running Program
And when each ListView row clicked, a Dialog with Country details will be display:
In Tablet, the AbsListView will be come to a GridView:
In Android Lollipop, the Dialog can be a little difference:
Some necessary files
package devexchanges.info.gridviewistview;
public class AsiaCountry {
private String name;
private int flagResource;
private String vietnameseName;
public AsiaCountry (int image, String name, String viName) {
this.flagResource = image;
this.name = name;
this.vietnameseName = viName;
}
public int getFlagResource() {
return flagResource;
}
public String getVietnameseName() {
return vietnameseName;
}
public String getName() {
return name;
}
}
Strings resource:





