Reputation: 5667
I have a TextView
ListView
that contains a selection of fonts
. When the user presses on one of these fonts, a function is called that changes the Typeface
of some other TextView
.
final ListView fontsListView = (ListView) this.view.findViewById(R.id.MenuLayout);
final String[] fonts = new String[] {
"Aclonica",
"Arimo-Regular",
"Calligraffitti-Regular",
"CherryCreamSoda",
"Chewy",
"ComingSoon",
"Cousine-Regular",
"CraftyGirls",
"CreepsterCaps-Regular",
"Crushed",
"FontdinerSwanky",
"HomemadeApple",
"IrishGrover",
"Nokora-Regular",
"JustAnotherHand",
"Kranky",
"LuckiestGuy",
"MaidenOrange",
"Montez-Regular",
"MountainsofChristmas-Regular"
};
ArrayList<String> fontsList = new ArrayList<String>();
fontsList.addAll( Arrays.asList(fonts) );
ArrayAdapter<String> listAdapter = new AdapterFontViewHolder(getActivity(), fonts);
fontsListView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Aclonica();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
fontsListView.setAdapter(listAdapter);
Why doesn't this work? It doesn't seem to detect the click at all.
Here is my custom Adapter:
public class AdapterFontViewHolder extends ArrayAdapter<String> {
private final Context context;
private final String[] values;
private Typeface[] fonts;
public AdapterFontViewHolder(Context context, String[] values) {
super(context, R.layout.fonts_simple_row, values);
this.context = context;
this.values = values;
// Create Typeface only once and use it.. Path you can change as per your directory
fonts = new Typeface[]{
Typeface.createFromAsset(context.getAssets(), "fonts/Aclonica.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/Arimo-Regular.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/Calligraffitti-Regular.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/CherryCreamSoda.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/Chewy.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/ComingSoon.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/Cousine-Regular.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/CraftyGirls.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/CreepsterCaps-Regular.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/Crushed.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/FontdinerSwanky.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/HomemadeApple.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/IrishGrover.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/Nokora-Regular.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/JustAnotherHand.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/Kranky.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/LuckiestGuy.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/MaidenOrange.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/Montez-Regular.ttf"),
Typeface.createFromAsset(context.getAssets(), "fonts/MountainsofChristmas-Regular.ttf"),
};
}
public class ViewHolder {
TextView textView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder vHolder;
if (convertView == null) {
// Create Instnce of view if its null & store object in ViewHolder (a class)
vHolder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.fonts_simple_row, parent, false);
vHolder.textView = (TextView) convertView.findViewById(R.id.rowTextView);
//Set ViewHolder instance in convertview in a tag as a object
convertView.setTag(vHolder);
} else {
// reuse as already converview is instansiated & it holds ViewHolder instance in tag
vHolder = (ViewHolder) convertView.getTag();
}
vHolder.textView.setText(values[position]);
//Here From Fonts array take Typeface
vHolder.textView.setTypeface(fonts[position]);
// vHolder.textView.setOnClickListener((View.OnClickListener) fonts[position]);
return convertView;
}
}
Should I set the ClickListener in my custom adapter instead? If so, how would I go about doing that?
Updated Answer:
fontsListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> adapter, View v, int position,
long arg3)
{
LaunchFont(fonts[position]);
}
});
This is the function that is called and depending on the position in the ListView, sets up a different Typeface:
public void LaunchFont(String fonts) {
Typeface myTypeface = Typeface.createFromAsset(getActivity().getAssets(), "fonts/" + fonts + ".ttf");
text_View.setTypeface(myTypeface);
view.findViewById(R.id.edtextDesigner).setVisibility(View.VISIBLE);
view.findViewById(R.id.toggleText).setVisibility(View.VISIBLE);
view.findViewById(R.id.closeFontMenu).setVisibility(View.GONE);
view.findViewById(R.id.MenuLayout).setVisibility(View.GONE);
}
This way I don't have to have a unique function for each Typeface.
Upvotes: 0
Views: 155
Reputation: 10353
after the following line:
final ListView fontsListView = (ListView) this.view.findViewById(R.id.MenuLayout);
Add below code:
fontsListView.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> adapter, View v, int position,
long arg3)
{
String value = fonts[position] ;
// assuming string and if you want to get the value on click of list item
// do what you intend to do on click of listview row
}
});
Upvotes: 1
Reputation: 6079
Change this:
fontsListView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
to
fontsListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
Upvotes: 1
Reputation: 3356
setOnItemClickListener instead of setOnItemSelectedListener
fontsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Aclonica();
}
});
Upvotes: 1