Trying to reorder a list. I have a layout with up arrow image on left, textview in middle and down arrow on right. XML sets images to invisible.
On list item press, I turn the arrows to visible FOR THAT ITEM. Based on up or down, I swap the list item and call myAdapter.notifyDataSetChanged() in which I set both image arrows to invisible. Works just fine, except...
The client wants the arrows to "follow" the list item till a "Done" button is pressed.
I'm having trouble wrapping my head around how I get the arrows to be visible on list item pressed +/- 1...any ideas?
Tia,
Roots
P.S. The app has a database where I store these changes vs. the volatile nature of the list views
Rootstonian said:
Trying to reorder a list. I have a layout with up arrow image on left, textview in middle and down arrow on right. XML sets images to invisible.
On list item press, I turn the arrows to visible FOR THAT ITEM. Based on up or down, I swap the list item and call myAdapter.notifyDataSetChanged() in which I set both image arrows to invisible. Works just fine, except...
The client wants the arrows to "follow" the list item till a "Done" button is pressed.
I'm having trouble wrapping my head around how I get the arrows to be visible on list item pressed +/- 1...any ideas?
Tia,
Roots
P.S. The app has a database where I store these changes vs. the volatile nature of the list views
Click to expand...
Click to collapse
Hello,
I hope I have understood your problem correctly.
Keep an int named selectedIndex. When a list item is clicked, store the index of the clicked list item in selectedIndex. Then each time the up/down arrow is pressed you should swap the list item at selectedIndex with the item at selectedIndex - 1/ selectedIndex + 1 and do selectedIndex--/selectedIndex++ depending on which arrow was pressed. Then call
myAdapter.notifyDataSetChanged().
Then finally when the "Done" button is pressed, make your arrows invisible and store the changes in the database.
Please let me know if this was helpful to you
I do that and the ITEM is swapping ok, but the arrows aren't...See if I can explain it
<upArrow> This is LiistView Row1 <downArrow>
This is ListView Row 2
If I press the downArrow, I get:
This is ListView Row 2
This is LiistView Row1
....
<upArrow> This is ListView Row 14 <downArrow>
For some reason, the arrows are at like a "random" position. I need the arrows to follow the item...like:
<upArrow> This is ListView Row 2 <downArrow>
This is LiistView Row1
Have you made a ListLayout XML that defines each row of your list to have a layout that looks something like this?
Image Text Image
You could simply make the arrow images visible for the list row which is selected and invisible for those which aren't. That way you don't have to worry about changing the positions of the images. It should work but I guess there would be a better way to do it rather than making so many ImageViews.
Can you please please post your ListLayout XML if you have already defined it? Also please explain what you do to change the position of the arrow images when they are clicked.
Custom Listview; I don't have code to "change the position", that's the TOPIC of my thread! ROFL
<?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="?android:attr/listPreferredItemHeight"
android:id="@+id/layout">
<ImageView android:id="@+id/up" android:layout_width="wrap_content"
android:layout_height="fill_parent" android:src="@drawable/up"
android:gravity="left" android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
androidnClick="onClick"
android:visibility="invisible"/>
<TextView android:id="@+id/toptext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20dip"
android:textStyle="bold"
android:layout_toRightOf="@+id/up" />
<TextView android:id="@+id/bottomtext" android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textSize="18dip" android:layout_below="@+id/toptext"
android:layout_alignParentBottom="true"
android:layout_toRightOf="@+id/up" />
<ImageView android:id="@+id/down" android:layout_width="wrap_content"
android:layout_height="30dip" android:src="@drawable/down"
android:gravity="right" android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
androidnClick="onClick"
android:visibility="invisible"/>
</RelativeLayout>
// Show arrows onClick
@Override
public void onItemClick(AdapterView<?> adapter, View v, int pos, long id) {
ImageView u = (ImageView) v.findViewById(R.id.up);
ImageView d = (ImageView) v.findViewById(R.id.down);
u.setVisibility(View.VISIBLE);
d.setVisibility(View.VISIBLE);
}
});
Click to expand...
Click to collapse
And what do you do when the arrow is clicked?
EDIT:
Can you please show the code for that too?
Not going to post actual code, but rest assured, it works. It's just a simple swap of list item, like:
// This is an "up" arrow click
temp = myList.get(pos); //where pos is row of item clicked
myList.set(pos - 1, myList.get(pos));
myList.set(pos, temp)
This works fine..tested it 100 times In my custom ArrayAdapter, if I set the up and down arrows to invisible, it works fine. Client wants the arrows to follow the item, in other words, swap the arrows too. This is the point I can't quite wrap my head around LOL
Have you tried using the ListView.getChildAt(iint) method to access the lists' rows' image views and then set them to their proper visibility in the method where you swap the items?
EDIT:
Sorry if i'm unable to help =/
Don't worry about it Like I've been saying, I just can't wrap my head around it. LOL
I'm working with setting the "tag" of each row to it's position in the list and then use "findViewWithTag", but still not having any luck.
I'm sure it's one of those "oh, duh moments" you get once you figure it out.
Thanks for trying...you did get me thinking about some new ideas and that's always a good thing!
Roots
Rootstonian said:
I do that and the ITEM is swapping ok, but the arrows aren't...See if I can explain it
<upArrow> This is LiistView Row1 <downArrow>
This is ListView Row 2
If I press the downArrow, I get:
This is ListView Row 2
This is LiistView Row1
....
<upArrow> This is ListView Row 14 <downArrow>
For some reason, the arrows are at like a "random" position. I need the arrows to follow the item...like:
<upArrow> This is ListView Row 2 <downArrow>
This is LiistView Row1
Click to expand...
Click to collapse
I assume you're using a list adapter right? Why not include the arrow status as a class member of whatever class it is that you are using as the base for the list adapter?
Yes Gene and I'm not sure what you mean. See if I can code a skeleton of what I have.
Code:
public class ReorderList extends ListActivity {
// standard on create stuff
// some code for app
// setup list adapter with my xml file
lv.setOnItemClickListener(new ListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View v, int pos, long id) {
ImageView u = (ImageView) v.findViewById(R.id.up);
ImageView d = (ImageView) v.findViewById(R.id.down);
u.setVisibility(View.VISIBLE);
d.setVisibility(View.VISIBLE);
}
});
} // end ReorderList class
private class mAdapter extends ArrayAdapter<String> {
public mAdapter(Context context, int textViewResourceId,ArrayList<String>editList) {
super(context, textViewResourceId, editList);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// bunch of stuff in here, but at end, I set up and down arrows to invisible
// this works perfect, except the arrows are gone and you have to click
// on the item again to move it; client doesn't like that
// If I don't set to invisible, row 12 has the arrows
}
public void onClick(View v) {
// this just swaps items based on up or down arrow press
// works fine
}
OK, I see. You're just using "String" as the base to initialize the template. Instead, create a new class:
Code:
class MyListType{
String str;
Boolean bIsArrowEnabled;
}
Now initialize your template with MyListType:
Code:
private class mAdapter extends ArrayAdapter<MyListType> {
public mAdapter(Context context, int textViewResourceId,ArrayList<MyListType>editList) {
super(context, textViewResourceId, editList);
}
You'll have to work some other issues out using this approach, but no instead of just a string in your editList, you got a string and a boolean. The boolean is part of the class so no matter where editList ends up in the list, the boolean is part of it.
Still having problems with this. Here's a dumb question LOL...
When I hit one of my arrows, I swap the list items and call notifyDataSetChanged(), which calls the @Overrided public View getView(.....). At the end of this method, there is a return....where in the code is this "sitting" on the return? It's not back to onCreate or onResume...I toasted them and no message. But the onItemClick() listener is "active" and working in onCreate().
Gotta love Android programming
//********************** Nevemind, I got it...i think
It involved setting the tagId for each row in the list view. Based on which arrow is pressed, I set a boolean value to true. If up, set images visible to tagId - 1 or tagId + 1 for down
Questions or Problems Should Not Be Posted in the Development Forum
Please Post in the Correct Forums
Moving to Q&A
Related
Hi all,
I'm new to Android development but have been going through countless tutorials. One thing I haven't found a tutorial for is how to take a list of items from a database and put them into a list that a user can scroll through and then select one of them to open up a second screen.
E.g. if I have colors in my database, the screen would simply show all the colors in a list that I can scroll through to find the one I want. When I find the one I want, I can then select it to open up a second layout with the details.
Can anyone direct me to a tutorial or information that might go over this? Or just give me some hints as to what I should search for since my attempts didn't return anything relevant.
Thanks.
Ok, here we go:
First you need to create a layout with at least a ListView, and set it to the current activity using setContentView.
Read some data from your database (I dunno how do this, sorry), and add it to a String array or a List<String> (any of them should work).
Set an ArrayAdapter to the array (or List).
Obtain a reference to your layout ListView using findViewById. Set the ArrayAdapter to that reference.
Your list now is filled
To handle the click events, you'll need declare this method:
Code:
YourListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
//Here the code to handle clicks
//You can use a switch method, using position as variable, to know wich of the items was clicked
}
});
Example
Please use the Q&A Forum for questions &
Read the Forum Rules Ref Posting
Moving to Q&A
So this is actually help making an app not a ROM. I am trying to use a spinner in my app as a drop down menu.
Here is the xml code:
<Spinner
android:id="@+id/fromSpinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:spinnerMode="dropdown"
android:entries="@array/from_array" />
Here is the Java code:
Spinner fromSpinner = (Spinner) findViewById(R.id.fromSpinner);
Spinner toSpinner = (Spinner) findViewById(R.id.toSpinner);
ArrayAdapter<String> toAdapter = new ArrayAdapter<String>(this, R.id.toSpinner, R.array.to_array);
toSpinner.setAdapter(toAdapter);
ArrayAdapter<String> fromAdapter = new ArrayAdapter<String>(this, R.id.fromSpinner, R.array.from_array);
fromSpinner.setAdapter(fromAdapter);
String toCurrency = (String) toSpinner.getSelectedItem();
String fromCurrency = (String) fromSpinner.getSelectedItem();
I'm not sure what the adapters do but I think I need them. Anyway toCurrency and fromCurrency aren't getting the values they are supposed to get. Anyone know what I am doing wrong. I am a complete noob say it may be something really dumb.
Don't know if this is helpful. Just put the source for the whole app at https://github.com/Dmobbjr/CurrencyCalculator
Really? I know some developers here could figure this out in ~10 minutes.
I'm not able to look deeper but it would help for next time if you could post the value you are getting and the value that should be there.
I'm going to guess you are getting either the first element in the array or null?
You haven't selected a value anywhere and there is no evidence of a user interaction before you try and get the selected value so either there is no value selected or the first element in the array is selected (by default) and you are getting its value.
Have you looked through the documentation for Spinners in the API Guides section of the Android Developers website? I can tell the answer is no because if you had you would know why you need the Adapters.
Kavrocks said:
I'm not able to look deeper but it would help for next time if you could post the value you are getting and the value that should be there.
I'm going to guess you are getting either the first element in the array or null?
You haven't selected a value anywhere and there is no evidence of a user interaction before you try and get the selected value so either there is no value selected or the first element in the array is selected (by default) and you are getting its value.
Have you looked through the documentation for Spinners in the API Guides section of the Android Developers website? I can tell the answer is no because if you had you would know why you need the Adapters.
Click to expand...
Click to collapse
I will change it to see what the value is later but I know it is not getting the value of the first element.
The user interaction happens before any of the code above is executed. I assumed that when I create the spinners and adapters in java it just takes what was already selected. Do I have to initialize the spinners and adapters before user selection?
Also I did read the documentation which is why I even knew about adapters but I am still a noob so some of the docs can be pretty confusing.
dmobbjr said:
I will change it to see what the value is later but I know it is not getting the value of the first element.
The user interaction happens before any of the code above is executed. I assumed that when I create the spinners and adapters in java it just takes what was already selected. Do I have to initialize the spinners and adapters before user selection?
Click to expand...
Click to collapse
The spinner needs to be initialised with data before the user selects it otherwise it would be empty. That's what the ArrayAdapter in your OP is for (which is explained in the API Guides section on spinners), however the android:entries attribute in your xml file is also adding data to the spinner so you have redundant code.
The getSelectedItem() will return an Object containing the currently selected item but as you are changing the data in the spinner beforehand this could be altering the data in the selected item position.
I recommend you remove the android:entries attribute and move the code except for the getSelectedItem() lines to the onCreate() method of your Activity.
You really need to provide more info for me about what is happening for me to help. I can't view the source on github at the moment.
If I implement the spinners in onCreate(), how do I access them from my button's onClick() method. Wouldn't the spinners be local to the onCreate method and therefore not accessible outside of it?
dmobbjr said:
If I implement the spinners in onCreate(), how do I access them from my button's onClick() method. Wouldn't the spinners be local to the onCreate method and therefore not accessible outside of it?
Click to expand...
Click to collapse
You aren't implementing them in onCreate(), they are implemented in xml which is normally inflated in onCreate() when you call setContentView(). All you are doing is adding the data to them in onCreate(). After the layout is inflated everything in that layout file is global (can be accessed anywhere) to that class.
You can get a reference to them anywhere in your code, providing the layout that contains them has been inflated into memory, using findViewById() and passing in the id of the spinner you want to get a reference to.
You can declare a class variable to store the reference to these and then just get the reference once in onCreate() and access it anywhere else in your code, ie. in onClick(), instead of having persistant calls to findViewById(). This approach is more efficient and cleaner.
When I try to call findViewById(toSpinner).getSelectedItem() The compiler says it can't resolve toSpinner as a variable. When I try to call R.id.toSpinner.getSelectedItem() it says it can't invoke getSelectedItem() on and int. I still cant access the spinners from within my onClick(). Sorry for the extreme noobishness but I just clearly do not know as much java as I should.
dmobbjr said:
When I try to call findViewById(toSpinner).getSelectedItem() The compiler says it can't resolve toSpinner as a variable. When I try to call R.id.toSpinner.getSelectedItem() it says it can't invoke getSelectedItem() on and int. I still cant access the spinners from within my onClick(). Sorry for the extreme noobishness but I just clearly do not know as much java as I should.
Click to expand...
Click to collapse
You are calling findViewById() returns a View object, you can't call getSelectedItem() on a View object. You first need to cast the View returned by findViewById to a spinner and then call getSelectedItem() on the spinner.
R.id.toSpinner is just an integer value pointing to a resource.
I already pointed out how you should go about calling getSelectedItem() on your spinner.
You can declare a class variable to store the reference to these and then just get the reference once in onCreate() and access it anywhere else in your code, ie. in onClick(), instead of having persistant calls to findViewById(). This approach is more efficient and cleaner.
Click to expand...
Click to collapse
I'll write the outline of the code you need for you.
Code:
public class TestActivity extends Activity {
private Spinner toSpinner;
public void onCreate() {
toSpinner = (Spinner) findViewById(R.id.toSpinner);
}
public void onClick() {
toSpinner.getSelectedItem();
}
}
I want to know how to add something to the settings menu in my application. Or if using JellyBean or ICS how to use the button on the right bottom?
I haven't found anything on this topic yet. Can someone give me a tutorial or example? My application is pretty much finished, this is the only thing I am stuck at .
I noticed that:
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
Click to expand...
Click to collapse
So I went to menu/main.xml
That creates that menu with Settings that leads to no page yet.
How do I open or create a settings page? Do I need to create a new activity and use onClick listener ?
Have you tried developer.android.com? Take a look here http://developer.android.com/guide/topics/ui/menus.html
Sent from a Toasted Devil
Here is the code:
while (i < 16) {
result.setText("example " + i);
i++;
}
As you can see, in this example, the only result that is going to be printed out for user is "example 15", what I would like to do is to print out all of the examples to user example1, 2 and so on. How can I do that? I have one TextView block in my .xml. How to print out all those "example 1..15" without putting them in one big string.
Mariius said:
How to print out all those "example 1..15" without putting them in one big string.
Click to expand...
Click to collapse
You can't. If you're working only with one TextView, then you need to concatenate all the text you need into a single string.
You can also use a ScrollView instead a single TextView, and attach to it programatically a TextView for each element that you need to show.
Greetings, I hope someone can help. I know the solution is "simple" - as in, a few words or lines to change. I just cannot figure it out.
I have an app. It's on the Play Store and fully functional, and so now I am trying to improve the UI. I am having trouble with MainActivity.java for a specific goal.
OBJECTIVE: an ImageButton on click animation and then next activity launches:
(1) User clicks image button
(2) Image button is animated (according to an anim XML file)
(3) THEN next activity is launched after button shows the animation
What I can already do:
I can make next activity just launch, no animation (code below shows this lack of animation)
I can make the image animate on click, but not launch next activity.
I can make it do both at the same time (animation starts but then is quickly interrupted by next activity)
MainActivity.java
Code:
/** Help Page Activity No Animation*/
public void gotohelp(View view) {
Intent intent = new Intent(this, HelpPageActivity.class);
startActivity(intent);
}
anim_rotate.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator">
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration="500"
android:startOffset="0"
android:repeatCount="1"
android:repeatMode="reverse" />
</set>
activity_main.xml:
Code:
<ImageButton
android:autoLink="web"
android:linksClickable="true"
android:id="@id/questionButton"
android:background="#00000000"
android:src="@drawable/question"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight=".25"
android:onClick="gotohelp"
android:contentDescription="@string/question" />
MainActivity.Java whole file is here: http://pastebin.com/4HztRmK3. Relevant code starts at line 196.
Thanks X 1000 for any help. If I pull out any more hair I will need to join a club.
I know I might have to go to StackOverflow with this but I love my XDA peeps. I'm bumping this just one time, because it has almost no views...
Anybody happen to know what I'm missing here?